Python的正则表达式(re包)
正则表达式(regular expression)主要功能是从字符串(string)中通过特定的模式(pattern),搜索想要找到的内容。
re 模块使 Python 语言拥有全部的正则表达式功能。
1.正则表达式的模式
1)单个字符:
. 任意的一个字符
a|b 字符a或字符b
[afg] a或者f或者g的一个字符
[0-4] 0-4范围内的一个字符
[a-f] a-f范围内的一个字符
[^m] 不是m的一个字符
\s 一个空格
\S 一个非空格
\d [0-9]
\D [^0-9]
\w [0-9a-zA-Z]
\W [^0-9a-zA-Z]
2)重复
紧跟在单个字符之后,表示多个这样类似的字符
* 重复 >=0 次
+ 重复 >=1 次
? 重复 0或者1 次
{m} 重复m次。比如说 a{4}相当于aaaa,再比如说[1-3]{2}相当于[1-3][1-3]
{m, n} 重复m到n次。比如说a{2, 5}表示a重复2到5次。小于m次的重复,或者大于n次的重复都不符合条件。
正则表达 相符的字符串举例
[0-9]{3,5} 9678
a?b b
a+b aaaaab
3) 位置
^ 字符串的起始位置
$ 字符串的结尾位置
正则表达 相符的字符串举例 不相符字符串
^ab.*c$ abeec cabeec (如果用re.search(), 将无法找到。)
4)返回控制
我们有可能对搜索的结果进行进一步精简信息。比如下面一个正则表达式:
output_(\d{4})
该正则表达式用括号()包围了一个小的正则表达式,\d{4}。 这个小的正则表达式被用于从结果中筛选想要的信息(在这里是四位数字)。这样被括号圈起来的正则表达式的一部分,称为群(group)。
我们可以m.group(number)的方法来查询群。group(0)是整个正则表达的搜索结果,group(1)是第一个群,以此类推。
import re
m = re.search("output_(\d{4})", "output_1986.txt")
print(m.group(1))
2.正则表达式的函数
1)re.match函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
语法:
re.match(pattern, string, flags=0)
代码示例:
line = "Cats are smarter than dogs"
matchObj = re.match(r'(.*) are (.*?) .*', line)
print( matchObj.group())
print( matchObj.group(1))
print( matchObj.group(1,2))
Cats are smarter than dogs
Cats
('Cats', 'smarter')
2)re.search函数
re.search 扫描整个字符串并返回第一个成功的匹配。匹配成功re.search方法返回一个匹配的对象,否则返回None。
语法:
re.search(pattern, string, flags=0)
代码示例:
line = "Cats are smarter than dogs"
matchObj = re.search(r'(.*) are (.*?) .*', line)
print( matchObj.group())
print( matchObj.group(1))
print( matchObj.group(1,2))
Cats are smarter than dogs
Cats
('Cats', 'smarter')
re.match与re.search的区别:
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配,如果完全匹配不上,则返回None。
3)re.sub()函数
用于替换字符串中的匹配项。
语法:
re.sub(pattern, repl, string, count=0, flags=0)
其中
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
代码示例:
import re
phone = "2004-959-559 # 这是一个国外电话号码"
# 删除字符串中的 Python注释
num = re.sub(r'#.*$', "", phone)
print("电话号码是: ", num) # 电话号码是: 2004-959-559
# 删除非数字(-)的字符串
num2 = re.sub(r'\D', "", phone,2) # \D表示非数字,替换两次
num = re.sub(r'\D', "", phone) # \D表示非数字,全部替换
print("电话号码是 : ", num2) # 电话号码是 : 2004959559 # 这是一个国外电话号码
print("电话号码是 : ", num) # 电话号码是 : 2004959559
4)re.findall()函数
根据正则表达式搜索字符串,将所有符合的子字符串放在一给表(list)中返回。
语法:
re.findall(pattern, string, flags=0)
代码示例:
line = "Cats are smarter than dogs"
matchObj = re.findall(r'(.*) are (.*?) .*', line)
matchObj
[('Cats', 'smarter')]
参考链接:https://www.cnblogs.com/vamei/archive/2012/08/31/2661870.html