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