Python正则表达式,非常强大而且常用的一个模块。之前处理字符串和文本比较少,所以没怎么用,现在开始研究NLP,很多地方需要用到这个模块。大部分是用在文本的前期预处理中。此处强调一点,很多人包括我以前,不太看重文本的预处理,更注重模型。其实是太多的脏数据,训练出来的模型很大程度上也不会有好的效果。
作用:正则表达式是一个特殊的字符序列,用于检查一个字符串是否与某种模式匹配。
换句话说,我们可以从一个原始的字符串中提取出我们所需要的格式的字符串。
1. 匹配
1.1 re.match函数
-
功能介绍:从字符串的起始位置匹配一个模式
-
语法:
re.match(pattern, string, flags=0)
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串 |
flags | 控制正则表达式的匹配方式 |
- 实例:
#!/usr/bin/python
import re
line = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
print "matchObj.group() : ", matchObj.group()
print "matchObj.group(1) : ", matchObj.group(1)
print "matchObj.group(2) : ", matchObj.group(2)
else:
print "No match!!"
# 输出:
# matchObj.group() : Cats are smarter than dogs
# matchObj.group(1) : Cats
# matchObj.group(2) : smarter
1.2 re.search方法
-
功能介绍:扫描整个字符串并返回第一个成功的匹配。
-
语法:
re.match(pattern, string, flags=0)
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串 |
flags | 控制正则表达式的匹配方式 |
- 实例:
import re
line = "Cats are smarter than dogs";
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
if searchObj:
print "searchObj.group() : ", searchObj.group()
print "searchObj.group(1) : ", searchObj.group(1)
print "searchObj.group(2) : ", searchObj.group(2)
else:
print "Nothing found!!"
输出:
# searchObj.group() : Cats are smarter than dogs
# searchObj.group(1) : Cats
# searchObj.group(2) : smarter
re.match与re.search的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
2. 检索和替换
2.1 re.sub函数
-
功能介绍:替换字符串中的匹配项。
-
语法:
re.sub(pattern, repl, string, count=0, flags=0)
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
repl | 替换的字符串或者一个函数 |
string | 要匹配的字符串 |
count | 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。 |
flags | 控制正则表达式的匹配方式 |
- 实例:
import re
phone = "2004-959-559 # 这是一个国外电话号码"
# 删除字符串中的 Python注释
num = re.sub(r'#.*$', "", phone)
print "电话号码是: ", num
# 删除非数字(-)的字符串
num = re.sub(r'\D', "", phone)
print "电话号码是 : ", num
2.2 re.compile 函数
-
功能介绍:编译正则表达式,生成一个正则表达式( Pattern )对象,供
match()、search()、findall()
等其他函数使用。其实就是事先定义了函数的正则表达式。 -
语法:
re.compile(pattern[, flags])
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
flags | 控制正则表达式的匹配方式 |
- match对象的四个类:
参数 | 描述 |
---|---|
group | 获得整个匹配的子串 |
start | 获取分组匹配的子串在整个字符串中的起始位置 |
end | 获取分组匹配的子串在整个字符串中的结束位置 |
span | 返回 (start(group), end(group)) |
- 实例:
>>>import re
>>> pattern = re.compile(r'\d+') # 用于匹配至少一个数字
>>> m = pattern.match('one12twothree34four') # 查找头部,没有匹配
>>> print m
None
>>> m = pattern.match('one12twothree34four', 2, 10) # 从'e'的位置开始匹配,没有匹配
>>> print m
None
>>> m = pattern.match('one12twothree34four', 3, 10) # 从'1'的位置开始匹配,正好匹配
>>> print m # 返回一个 Match 对象
<_sre.SRE_Match object at 0x10a42aac0>
>>> m.group(0) # 可省略 0
'12'
>>> m.start(0) # 可省略 0
3
>>> m.end(0) # 可省略 0
5
>>> m.span(0) # 可省略 0
(3, 5)
2.3 findall()函数:
-
功能介绍:找到正则表达式所匹配的所有子串,并返回一个列表。
-
语法:
findall(string[, pos[, endpos]])
参数 | 描述 |
---|---|
string | 待匹配的字符串 |
pos | 指定字符串的起始位置,默认为 0 |
endpos | 指定字符串的结束位置,默认为字符串的长度 |
- 实例:
import re
pattern = re.compile(r'\d+') # 查找数字
result1 = pattern.findall('runoob 123 google 456')
result2 = pattern.findall('run88oob123google456', 0, 10)
print(result1)
print(result2)
# 输出:
# ['123', '456']
# ['88', '12']