1. 程式人生 > >Python自然語言處理—正則表示式檢測片語re.search()

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的詞