- 简介
- re.match函数
- re.search方法
- re.match与re.search的区别
- 检索和替换
- repl 参数是一个函数
- compile 函数
- findall
- 正则表达式对象
- 正则表达式模式
正则表达式是一种特殊的字符序列,它的作用是帮助开发者快速检查一个字符串是否与程序预期设想的某种规则匹配。
在之前的版本中,python引入了re模块,这使得Python语言拥有所有的正则表达式功能。
compile函数会根据一个模式字符串以及一个标志参数,生成一个正则表达式对象。它有着一系列用来正则匹配与替换的方法。
在本五年中我们会以已介绍这些处理正则的方法。
re.match函数会从字符串起始位置匹配,如果起始位置不匹配就会返回none参数。
语法格式如下:
re.match(pattern, string, flags=0)
pattern参数:匹配的正则表达式
string参数:要匹配的字符串。
flags参数:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
具体实例如下:
import re
print(re.match('dtcloud', 'dtcloud360.com').span()) # 在起始位置匹配
print(re.match('com', 'dtcloud360.com')) # 不在起始位置匹配
import re
line = "dtcloud are smarter than other"
# .* 表示任意匹配除换行符(n、r)之外的任何单个或多个字符
# (.*?) 表示"非贪婪"模式,只保存第一个匹配到的子串
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!!")
re.search方法
re.search会扫描整个字符串并返回第一个成功的匹配对象。
re.search(pattern, string, flags=0)
pattern参数:匹配的正则表达式。
string参数:要匹配的字符串。
flag参数:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
匹配成功re.search方法返回一个匹配的对象,如果没匹配到就会返回None。
import re
print(re.search('dtcloud', 'dtcloud360.com').span()) # 在起始位置匹配
print(re.search('com', 'dtcloud360.com').span()) # 不在起始位置匹配
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!!")
re.match与re.search的区别
re.match 只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None,而 re.search会匹配整个字符串,直到找到一个匹配。
如下是对比:
import re
line = "dtcloud are smarter than others"
matchObj = re.match( r'others', line, re.M|re.I)
if matchObj:
print ("match --> matchObj.group() : ", matchObj.group())
else:
print ("No match!!")
matchObj = re.search( r'others', line, re.M|re.I)
if matchObj:
print ("search --> matchObj.group() : ", matchObj.group())
else:
print ("No match!!")
import re
line = "dtcloud are smarter than others"
matchObj = re.match( r'dtcloud', line, re.M|re.I)
if matchObj:
print ("match --> matchObj.group() : ", matchObj.group())
else:
print ("No match!!")
matchObj = re.search( r'dtcloud', line, re.M|re.I)
if matchObj:
print ("search --> matchObj.group() : ", matchObj.group())
else:
print ("No match!!")
检索和替换
re模块中提供了re.sub用来替换字符串的匹配项。
语法格式如下:
re.sub(pattern, repl, string, count=0, flags=0)
pattern 参数 : 必选参数之一,正则中的模式字符串。
repl 参数: 必选参数之一,替换的字符串,也可为一个函数。
string 参数 : 必选参数之一,要被查找替换的原始字符串。
count 参数: 可选参数,模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
flags 参数: 可选参数,编译时用的匹配模式,数字形式。
下面是简单实例:
import re
phone = "2022-996-510 # 这是一个电话号码"
# 删除注释
num = re.sub(r'#.*$', "", phone)
print ("电话号码 : ", num)
# 移除非数字的内容
num = re.sub(r'D', "", phone)
print ("电话号码 : ", num)
repl 参数是一个函数
以下实例中将字符串中的匹配的数字乘于 2:
import re
# 将匹配的数字乘于 2
def double(matched):
value = int(matched.group('value'))
return str(value * 2)
s = 'DTCLOUD360'
print(re.sub('(?Pd+)', double, s))
compile 函数
compile 函数用于编译正则表达式,生成一个正则表达式对象,为 match() 和 search() 函数所使用。
如下所示:
其中括号中的0可省略。
group方法作用是获取一个或多个分组匹配字符串,整个获取时,直接使用 group() 或 group(0)即可。
start方法作用是获取需要匹配的字符串的起始位置,默认为0
end方法用于获取结束位置,默认参数0
span方法返回开始结束位置参数。
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。
它与re.match与re.search的区别在于,re.match与re.search匹配一次,而findall匹配所有。
语法格式如下:
re.findall(pattern, string, flags=0) 或 pattern.findall(string[, pos[, endpos]])
本例是查找字符串中的数字:
import re
result1 = re.findall(r'd+','dtcloud 360 baidu 789')
pattern = re.compile(r'd+') # 查找数字
result2 = pattern.findall('dtcloud 360 baidu 789')
result3 = pattern.findall('dtc12loud34bai56du78', 0, 10)
print(result1)
print(result2)
print(result3)
正则表达式对象
re.RegexObject:re.compile() 返回 RegexObject 对象。
re.MatchObject:group() 返回被 RE 匹配的字符串。
模式字符串使用特殊的语法来表示一个正则表达式。字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。多数字母和数字前加一个反斜杠时会拥有不同的含义。
下表会列出部分模式与法中的特殊元素:
| 模式 | 描述 |
|---|---|
| ^ | 匹配开头 |
| $ | 匹配结尾 |
| . | 匹配除了换行符以外的任意字符,当然也可通过re.DOTALL标记指定来匹配包括了换行符的任意字符 |
| […] | 表示一组字符 |
| [ ^… ] | 表示匹配不在其中的字符,例如[ ^dtcloud ]表示匹配除了d,t,c,l,o,u,d以外的字符 |
| re* | 匹配0或者多个表达式 |
| re+ | 匹配1或多个的表达式。 |
| re? | 以非贪婪方式匹配0个或1个由前面的正则表达式定义的片段 |
| re{ n} | 匹配n个前面表达式。例如,"o{2}“不能匹配"Bob"中的"o”,但是能匹配"food"中的两个o。 |
| re{ n,} | 精确匹配n个前面表达式。例如,"o{2,}“不能匹配"Bob"中的"o”,但能匹配"foooood"中的所有o。"o{1,}“等价于"o+”。"o{0,}“则等价于"o*”。 |
| re{ n, m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
| a | b |
| (re) | 匹配括号内的表达式,也表示一个组 |
| w | 匹配数字字母下划线 |
| W | 匹配非数字字母下划线 |
| s | 匹配任意空白字符,等价于 [tnrf]。 |
| S | 匹配任意非空字符 |
| d | 匹配任意数字,等价于 [0-9]。 |
| D | 匹配任意非数字 |
| A | 匹配字符串开始 |
| Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。 |
| z | 匹配字符串结束 |
| G | 匹配最后匹配完成的位置 |
| b | 匹配一个单词边界,也就是指单词和空格间的位置。例如never中的后面的er |
| B | 匹配非单词边界。例如匹配 “verb” 中的 ‘er’ |
| n, t, 等 | 匹配一个换行符。匹配一个制表符, 等 |
| 1…9 | 匹配第n个分组的内容 |
| 10 | 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。 |



