Python自然语言处理—正则表达式检测词组re.search()

1. 开头和结尾 ^ $

import re
import nltk
wordlist = [w for w in nltk.corpus.words.words("en") if w.islower()]
print([w for w in wordlist if re.search("^ed",w)])  # 已ed开头
print([w for w in wordlist if re.search("ed$",w)])  # 已ed结尾

很好理解^表示开头,$表示结尾。结果分别是

ed开头 ['edacious', 'edaciously', 'edaciousness', 'edacity', 'edaphic', 'edaphology', 'edaphon', 'edder', 'eddish', 'eddo', 'eddy', 'eddyroot', 'edea', ......]

ed结尾 ['abaissed', 'abandoned', 'abased', 'abashed', 'abatised', 'abed', 'aborted', 'abridged', 'abscessed', 'absconded', 'absorbed', 'abstracted', 'abstricted', ... ...]

那么'ed'表示的就是含有ed,无论ed是出现在开始结尾或者中间

print([w for w in wordlist if re.search("ed",w)])  # 含有ed

2 任意字符 . *

. 代表任意字符而

print([w for w in wordlist if re.search("^e...d$",w)])

上段代码代表e开头d结尾,中间是有三个字符 。['eared', 'eaved', 'ecoid', 'ectad', 'edged', 'eland', 'embed', 'emend', 'ended', 'entad', 'ephod', 'equid', 'essed', 'ethid', 'eupad']

* 代表的是前一个字符或者项目出现0-无限次

print([w for w in wordlist if re.search("^es*ed$",w)])

上段代表表示e开头 ed结尾,中间有0-无限个s 。['essed']

3. 范围[] 

[]中的字符表示一个范围

print([w for w in wordlist if re.search("^[ghi][mon][jlk][def]$",w)])

表示第一个字母是ghi中的一个,第二个字母是mon中的一个以此类推['gold', 'golf', 'hold', 'hole']

[]搭配*会有什么效果呢

扫描二维码关注公众号,回复: 4112919 查看本文章
print([w for w in wordlist if re.search("^[ha]*$",w)])

第一个字母是ha中的一个,第二字母也是ha中的一个以此类推['a', 'aa', 'ah', 'aha', 'h', 'ha', 'hah']。注意我加了$符号,如果不加代则没有了结尾必须是ha中一个字母的限制,会多找出很多词。

[]括号内的^代表着不包含

print([w for w in wordlist if re.search("^[^a-y]+$",w)])

代码结果只有一个z,a-y代表abcdef...y, +和*相似不过+要求至少有一个。

4.示例

wsj = sorted(set(nltk.corpus.treebank.words()))
print([w for w in wsj if re.search("^[0-9]+\.[0-9]+$",w)])
# 开头是0-9的数字至少一个,接着是一个.(因为\.代表就是真实意义的.),结尾是0-9的数字任意
# ['89.9', '9.3', '9.32', '9.37', '9.45', '9.5',...]
 
print([w for w in wsj if re.search("^[A-Z]+\$$",w)])
# 开头是A-Z,以$符号结尾
# ['C$', 'US$']

print([w for w in wsj if re.search("^[0-9]{4}$",w)])
# 0-9组成的4位数
# ['1614', '1637', '1787', '1901',...]

print([w for w in wsj if re.search("^[0-9]+-[a-z]{3,5}$",w)])
# 开头是任意数字,接一个横杠-,再接a-z组成的长度是3到5的单词
# ['10-day', '10-lap', '10-year', '100-share'...]

print([w for w in wsj if re.search("^[a-z]{5,}-[a-z]{2,3}-[a-z]{,6}$",w)])
# 开头是长度5的单词,接一个横杠,再接长度2,3的单词,再接一个横杠,最后一长度至少为6的单词结尾
# ['black-and-white', 'bread-and-butter', 'father-in-law', 'machine-gun-toting', 'savings-and-loan']

print([w for w in wsj if re.search("(ed|ing)$",w)])
# 表示结尾是ed或者ing,()的作用的限制$的范围
# ['62%-owned', 'Absorbed', 'According',...]

print([w for w in wsj if re.search("ed|ing$",w)])
# 去掉括号后表示含有ed或者结尾是ing的词

猜你喜欢

转载自blog.csdn.net/m0_38126215/article/details/83862736
今日推荐