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']
[]搭配*會有什麼效果呢
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的詞