自然语言处理3.4——使用正则表达式检测词组搭配

许多语言处理任务都涉及模式匹配。以前我们使用‘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’表示一个原始字符串。

posted on 2016-10-12 22:02  波比12  阅读(3925)  评论(0编辑  收藏  举报

导航