许多语言处理任务都涉及模式匹配。以前我们使用‘stsrtswith(str)’或者‘endswith(str)’来寻找特定的单词。但是下面引入正则表达式,正则表达式是一个强大的模块,他不属于哪一种特定的语言,是一个强大的语言处理工具。
在Python中使用正则表达式需要使用import re来导入re模块。还需要用于搜索的词汇链表。这里我们再次使用前面使用过的语料库,对它进行预处理消除某些名称。
>>>import re >>>wordlist=[w for w in nltk.corpus.words.words('en') if w.islower()]
1、使用基本的元字符
使用正则表达式《ed$》查找以ed结尾的词汇。使用函数re.search(p,s)检查字符串s中是否有模式p。使用美元符号,在正则表达式中用来匹配单词的末尾。
>>>print([w for w in wordlist if re.search('ed$',w)]) [['abaissed', 'abandoned', 'abased', 'abashed', 'abatised', 'abed', 'aborted', 'abridged', 'abscessed', ...]
通配符‘.’用来匹配任何单个字符。假设有一个8个字符组成的字谜,j是第三个字母,t是第六个字母。
>>>print([w for w in wordlist if re.search('^..t..t..$',w)]) ['abjectly', 'adjuster', 'dejected', 'dejectly', 'injector', 'majestic', 'objectee', 'objector', 'rejecter',...]
插入字符‘^’匹配字符串的开始。
2、范围和闭包
在手机输入法联想提示,九宫格,输入序列4633可以得到hole和golf,还可以产生哪些字符?使用下面正则表达式进行判断:
>>>print([w for w in wordlist if re.search('^[ghi][mno][jlk][def]$',w)]) ['gold', 'golf', 'hold', 'hole']
正则表达式中‘+’号表示‘前面项目的一个或者多个实例’。‘*’表示‘前面的项目的零个或者多个实例’。当‘^’出现在方括号内的第一个字符位置时有其他的功能。例如"[^aeiou]"匹配除元音字母以外的所有字母。
下面是另外一些正则表达式的例子。使用一些新的符号:|、{}、和|
>>> wsj = sorted(set(nltk.corpus.treebank.words())) >>> [w for w in wsj if re.search('^[0-9]+.[0-9]+$', w)] ['0.0085', '0.05', '0.1', '0.16', '0.2', '0.25', '0.28', '0.3', '0.4', '0.5', '0.50', '0.54', '0.56', '0.60', '0.7', '0.82', '0.84', '0.9', '0.95', '0.99', '1.01', '1.1', '1.125', '1.14', '1.1650', '1.17', '1.18', '1.19', '1.2', ...] >>> [w for w in wsj if re.search('^[A-Z]+$$', w)] ['C$', 'US$'] >>> [w for w in wsj if re.search('^[0-9]{4}$', w)] ['1614', '1637', '1787', '1901', '1903', '1917', '1925', '1929', '1933', ...] >>> [w for w in wsj if re.search('^[0-9]+-[a-z]{3,5}$', w)] ['10-day', '10-lap', '10-year', '100-share', '12-point', '12-year', ...] >>> [w for w in wsj if re.search('^[a-z]{5,}-[a-z]{2,3}-[a-z]{,6}$', w)] ['black-and-white', 'bread-and-butter', 'father-in-law', 'machine-gun-toting', 'savings-and-loan'] >>> [w for w in wsj if re.search('(ed|ing)$', w)] ['62%-owned', 'Absorbed', 'According', 'Adopting', 'Advanced', 'Advancing', ...]
正则表达式总结如下:
Table 3-3. Basic regular expression metacharacters, including wildcards, ranges, and closures
Operator |
Behavior |
. |
通配符,匹配所有字符 |
^abc |
匹配以abc开始的字符串 |
abc$ |
匹配以abc结尾的字符串 |
[abc] |
匹配字符集合 |
[A-Z0-9] |
匹配字符范围 |
ed|ing|s |
匹配指定的字符串 |
* |
前面的项目的零个或多个(Kleene闭包) |
+ |
前面的项目的一个或多个 |
? |
前面的项目的一个或零个(可选) |
{n} |
重复n次,n为非负整数 |
{n,} |
至少重复n次 |
{,n} |
至多重复n次 |
{m,n} |
重复多于m次不多于n次 |
a(b|c)+ |
括号表示操作符的范围 |
我们在使用re正则表达式时候要可以使用在字符串加一个前缀‘r’表示一个原始字符串。