Python技能树(一):Python正则表达式

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']

你可能感兴趣的:(python,Python技能树,python,正则表达式,re.sub,re.compile,re.match)