基于Python的语料库数据处理(五)
《Python玩转语料库数据》专栏·第5篇
文 | 段洵
2320字 | 10 分钟阅读
【数据科学与人工智能】已开通Python语言社群,学用Python,玩弄数据,求解问题,以创价值。喜乐入群者,请加微信号shushengya360,或扫描文末二维码,添加为好友,同时附上Python-入群。有朋自远方来,不亦乐乎,并诚邀入群,以达相互学习和进步之美好心愿。
一、正则表达式的概念
正则表达式 regular expression)是用来进行较复杂文本处理,特别是复杂的查找或替换处理的计算机语言。我们在进行计算机编程或者文本处理时,通常需要进行一些文本的查找、替换。如果查找或替换的工作比较复杂,就需要借助正则表达式来完成。又如,我们需要对文本进行清洁处理(如一次删除所有词性赋码)或者提取文本的特定信息时,往往也需要使用正则表达式。因此,正则表达式在语料库语言学或计算语言学研究中使用非常广泛。
如果我们需要搜索某个字符或字符串(单词),如字符i或者字符串in,则只需在文本阅读器的查找中输入in,即可查找到。但如果我们需要进行更复杂的搜索,如搜索出所有带字符i或者字符串in的单词,或者需要搜索所有以ing或ed结尾的单词时,一般搜索则无能为力就需要使用正则表达式来实现。
在 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为需要替换的内容, string为需要检索的字符串。re.sub()检索某个字符串(string),并将字符串中与所有表达式(pattern)匹配的内容都进行替换( replacement)。
re.sub(pattern, replacement, string)
二、普通字符
所有的字母、数字、没有特殊意义的符号(如下划线等)都是普通字符literals)。在正则表达式中,一个普通字符匹配一个与之相对应的字符书写正则表达式时,需要注意两点:一是必须首先引入re模块(import re)二是将表达式放在引号中间,引号前一般加字母r,r表示后面书写的内容是raw string,以避免转义字符等的转义。
我们来看一个例子。例子中有三个表达式对字符串'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)或称做转义字符,是具有特殊意义的一些字符。它们具有一定的特殊意义,能够匹配某些具有特殊意义的字符。需要注意的是,一个元字符只能匹配一个字符。常用转义字符如下表所示。
字符 | 注释 |
.
\w
\s
\d
\W
\S
\D
\b | 匹配所有字母、数字、空白和除换行符以外的任意字符 匹配任意字母或数字或下划线
匹配任意空白
匹配任意数字
匹配非字母和非数字字符(不匹配下划线) 匹配非空白 匹配非数字
匹配单词的开始或结束 |
范例:
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']
'.'可以匹配上述文本中的任意一个字母、数字、空白和行末的句点。
'\w'可以匹配上述文本中的任意一个字母和数字,但不能匹配空白和行末的句点。
'\s'可以匹配上述文本中的任意一个空白。
'\d'd可以匹配上述文本中的任意一个数字。
'is'既可以匹配上述文本中His中的is,也可以匹配is单词。
'\bis'只能匹配上述文本中的is单词,不能匹配His中的is。
'is\b'既可以匹配上述文本中His中的is,也可以匹配is单词。
'e'既可以匹配单词 phone中的字母e,也可以匹配单词 number中的字母e;但是,'e\b'则只能匹配单词phone中的字母e。
推荐阅读:
公众号推荐
数据思践
数据思践公众号记录和分享数据人思考和践行的内容与故事。
Python语言群
诚邀您加入
请扫下方二维码加我为好友,备注Python-入群。有朋自远方来,不亦乐乎,并诚邀入群,以达相互学习和进步之美好心愿。