許多語言處理任務都涉及模式匹配。以前我們使用‘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’表示一個原始字符串。