基于Python的語料庫數(shù)據(jù)處理(五)
《Python玩轉(zhuǎn)語料庫數(shù)據(jù)》專欄·第5篇
文?| 段洵??
2320字 | 10?分鐘閱讀
【數(shù)據(jù)科學與人工智能】已開通Python語言社群,學用Python,玩弄數(shù)據(jù),求解問題,以創(chuàng)價值。喜樂入群者,請加微信號shushengya360,或掃描文末二維碼,添加為好友,同時附上Python-入群。有朋自遠方來,不亦樂乎,并誠邀入群,以達相互學習和進步之美好心愿。
一、正則表達式的概念
正則表達式 regular expression)是用來進行較復雜文本處理,特別是復雜的查找或替換處理的計算機語言。我們在進行計算機編程或者文本處理時,通常需要進行一些文本的查找、替換。如果查找或替換的工作比較復雜,就需要借助正則表達式來完成。又如,我們需要對文本進行清潔處理(如一次刪除所有詞性賦碼)或者提取文本的特定信息時,往往也需要使用正則表達式。因此,正則表達式在語料庫語言學或計算語言學研究中使用非常廣泛。
如果我們需要搜索某個字符或字符串(單詞),如字符i或者字符串in,則只需在文本閱讀器的查找中輸入in,即可查找到。但如果我們需要進行更復雜的搜索,如搜索出所有帶字符i或者字符串in的單詞,或者需要搜索所有以ing或ed結尾的單詞時,一般搜索則無能為力就需要使用正則表達式來實現(xiàn)。
在 Python中使用正則表達式需要引人re模塊,引入re模塊需要使用 importre語 句。在引入re模塊后,即可通過下列方法來使用正則表達式。
re模塊常用的方法有re.search()、 re.findall()和 re.sub()等。
1.re.search()
re.search()方法的基本句法格式如下。pattern為正則表達式, string為需要檢索的字符串。re.search()方法用來檢索某個字符串,并返回與正則表達式匹配的第一個結果。
re.search(pattern, string)2. re.findall()
re.findall()方法的基本句法格式如下。pattern為正則表達式, string為需要檢索的字符串。re.findall()檢索某個字符串,與re.search()不同的是,它返回一個列表,列表中包含與表達式匹配的所有結果。
re.findall(pattern, string)3.re.sub()
re.sub()方法的基本句法格式如下。pattern為正則表達式,replacement為需要替換的內(nèi)容, string為需要檢索的字符串。re.sub()檢索某個字符串(string),并將字符串中與所有表達式(pattern)匹配的內(nèi)容都進行替換( replacement)。
re.sub(pattern, replacement, string)二、普通字符
所有的字母、數(shù)字、沒有特殊意義的符號(如下劃線等)都是普通字符literals)。在正則表達式中,一個普通字符匹配一個與之相對應的字符書寫正則表達式時,需要注意兩點:一是必須首先引入re模塊(import re)二是將表達式放在引號中間,引號前一般加字母r,r表示后面書寫的內(nèi)容是raw?string,以避免轉(zhuǎn)義字符等的轉(zhuǎn)義。
我們來看一個例子。例子中有三個表達式對字符串'abcdbcdcd'進行檢索。第一個表達式'abc'在字符串'abcdbcdcd'中可以匹配到一個結果,即'abcdbcdcd'的第一至三個字符。表達式'bc'在字符串中可以匹配到兩個結果,即匹配第二至第三個字符和第五至第六個字符。表達式'cdd'則不能匹配成功,返回一個空的列表。
import?re
string?=?'abcdbcdcd'
#?Note:?usually?the?letter?'r'?goes?before?a?string,?meaning?its?a?'raw?string'
print(re.findall(r'abc',?string))???????????????#?['abc']
print(re.findall(r'bc',?string))????????????????#?['bc',?'bc']
print(re.findall(r'cdd',?string))???????????????#?[]
三、元字符
元字符(Metacharacters)或稱做轉(zhuǎn)義字符,是具有特殊意義的一些字符。它們具有一定的特殊意義,能夠匹配某些具有特殊意義的字符。需要注意的是,一個元字符只能匹配一個字符。常用轉(zhuǎn)義字符如下表所示。
字符 | 注釋 |
. ? \w ? \s ? \d ? \W ? \S ? \D ? \b | 匹配所有字母、數(shù)字、空白和除換行符以外的任意字符 ?匹配任意字母或數(shù)字或下劃線 ? 匹配任意空白 ? 匹配任意數(shù)字 ? 匹配非字母和非數(shù)字字符(不匹配下劃線) 匹配非空白 ?匹配非數(shù)字 ? 匹配單詞的開始或結束 |
范例:
import?re
string?=?'His?phone?number?is?12345678.'
print(re.findall(r'.',?string))?????#?['H',?'i',?'s',?'?',?'p',?'h',?'o',?'n',?'e',?'?',?'n',?'u',?'m',?'b',?'e',?'r',?'?',?'i',?'s',?'?',?'1',?'2',?'3',?'4',?'5',?'6',?'7',?'8',?'.']
print(re.findall(r'\w',?string))????#?['H',?'i',?'s',?'p',?'h',?'o',?'n',?'e',?'n',?'u',?'m',?'b',?'e',?'r',?'i',?'s',?'1',?'2',?'3',?'4',?'5',?'6',?'7',?'8']
print(re.findall(r'\s',?string))????#?['?',?'?',?'?',?'?']
print(re.findall(r'\d',?string))????#?['1',?'2',?'3',?'4',?'5',?'6',?'7',?'8']
print(re.findall(r'is',?string))????#?['is',?'is']
print(re.findall(r'\bis',?string))??#?['is']
print(re.findall(r'is\b',?string))??#?['is',?'is']
print(re.findall(r'e',?string))?????#?['e',?'e']
print(re.findall(r'e\b',?string))???#?['e']
'.'可以匹配上述文本中的任意一個字母、數(shù)字、空白和行末的句點。
'\w'可以匹配上述文本中的任意一個字母和數(shù)字,但不能匹配空白和行末的句點。
'\s'可以匹配上述文本中的任意一個空白。
'\d'd可以匹配上述文本中的任意一個數(shù)字。
'is'既可以匹配上述文本中His中的is,也可以匹配is單詞。
'\bis'只能匹配上述文本中的is單詞,不能匹配His中的is。
'is\b'既可以匹配上述文本中His中的is,也可以匹配is單詞。
'e'既可以匹配單詞 phone中的字母e,也可以匹配單詞 number中的字母e;但是,'e\b'則只能匹配單詞phone中的字母e。
推薦閱讀:
? ? ? ? ? ??? ?
公眾號推薦
數(shù)據(jù)思踐
數(shù)據(jù)思踐公眾號記錄和分享數(shù)據(jù)人思考和踐行的內(nèi)容與故事。
Python語言群
誠邀您加入
請掃下方二維碼加我為好友,備注Python-入群。有朋自遠方來,不亦樂乎,并誠邀入群,以達相互學習和進步之美好心愿。
