自然語言處理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’表示一個原始字符串。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM