模式 | 描述 |
---|---|
^ | 匹配 字符串的开始 |
\w | 匹配 字母数字及下划线 |
\W | 匹配 非字母数字及下划线 |
\s | 匹配 任意空白字符,即空格 |
\S | 匹配 任意非空字符 |
\d | 匹配 任意数字,等价于[0-9], \d+ 表示匹配多个数字 |
\D | 匹配 任意非数字 |
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
. | 匹配任意字符,除了换行符 |
[…] | 用来表示一组字符,单独列出;例[abc], 匹配字符’a’, ‘b’, ‘c’ |
[^…] | 不在[] 中的字符;例[^abc], 匹配除了字符’a’, ‘b’, ‘c’ 外的所有字符 |
* | 匹配 0个或多个的表达式 |
+ | 匹配 1个或多个的表达式 |
? | 匹配 0个或1个由前面的正则表达式定义的片段,非贪婪方式 |
{n} | 精准匹配 n个前面表达式 |
{n,m} | 匹配 n到m次由前面的正则表达式定义的片段,贪婪方式 |
a|b | 匹配 a或b |
() | 匹配括号内的表达式,也表示一个组 |
& | 匹配字符串的末尾 |
re 库采用 raw string 类型表示正则表达式,表示为 r'正则表达式'
raw string 是不含 转义符的字符串
函数 | 说明 |
---|---|
re.search() | 在一个字符串中搜索匹配正则表达式的第一个位置,返回 match 对象 |
re.match() | 从一个字符串的开始位置起匹配正则表达式,返回 match 对象 |
re.findall() | 搜索字符串,以列表类型返回全部能匹配的子串 |
re.split() | 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型 |
re.finditer() | 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是 match 对象 |
re.sub() | 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串 |
函数参数:
match.string
返回待匹配的文本
match.re
返回正则表达式
match.pos
正则表达式开始搜索的位置
match.endpos
正则表达式搜索结束的位置
match.group()
获得匹配后的字符串
match.start()
所匹配的字符串在原字符串的开始位置
match.end()
所匹配的字符串在原字符串的结束位置
match.span()
返回(match.start(),match.end())的元组
search()
函数会扫描整个字符串,并且用 group()
函数 返回第一个满足正则表达式的字符串,匹配失败返回 None
re.search()
并不要求必须从字符串的开头进行匹配,也就是说,正则表达式可以是字符串任意位置开始的子串。
import re
str1 = '##123Abc!@#你好呀\n\r'
ret = re.search('\w',str1)
print(ret)
print(ret.group())
print(ret.span())
--> <re.Match object; span=(2, 3), match='1'>
--> 1
--> (2, 3)
match()
函数和search()
函数的功能差不多,区别是 match()
函数是必须从字符串的开头匹配,如果开头不满足正则表达式,后面满足正则表达式的字符串也不会被匹配到。
example1:
import re
str1 = '##123Abc!@#你好呀\n\r'
ret = re.match('\W\W\w',str1)
print(ret)
print(ret.group())
print(ret.span())
--> <re.Match object; span=(0, 3), match='##1'>
--> ##1
--> (0, 3)
example2:
import re
str1 = '##123Abc!@#你好呀\n\r'
ret = re.match('\w',str1)
print(ret)
--> None
re.findall('正则表达式',文本内容,修饰符)
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有。
import re
text = '2023年,6月份, 23日'
pattern = re.compile(r'\d{4}年|\d{1}月|\d{2}日')
res = pattern.findall(text)
print(res)
--> ['2023年', '6月', '23日']
re.split('正则表达式','文本',[maxsplit=0])
maxsplit是允许被分割成几个子串,默认为 0,不限制次数。
import re
ret = re.split('\W+', 'runoob, runoob, runoob.')
print(ret)
ret = re.split('(\W+)', ' runoob, runoob, runoob.')
print(ret)
ret = re.split('\W+', ' runoob, runoob, runoob.', 1)
print(ret)
ret = re.split('aa*', 'hello world') # 对于一个找不到匹配的字符串而言,split 不会对其作出分割
print(ret)
--> ['runoob', 'runoob', 'runoob', '']
--> ['', ' ', 'runoob', ', ', 'runoob', ', ', 'runoob', '.', '']
--> ['', 'runoob, runoob, runoob.']
--> ['hello world']
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
ret = re.finditer('\w',str1)
for i in ret:
print(i.group(),end='')#输出时不换行
re 模块提供了re.sub用于替换字符串中的匹配项。
repl 可以是替换的字符串,也可为一个函数。
count 表示模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
example1: repl 为字符串
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import re
phone = "2004-959-559 # 这是一个国外电话号码"
# 删除字符串中的 Python注释
num = re.sub(r'#.*$', "", phone)
print "电话号码是: ", num
# 删除非数字(-)的字符串
num = re.sub(r'\D', "", phone)
print "电话号码是 : ", num
--> 电话号码是: 2004-959-559
--> 电话号码是 : 2004959559
该函数将创建一个正则表达式的对象,可以实现更有效率的复用。
import re
find_xx = re.compile('正则表达式',修饰符)
ret = find_xx.search(带匹配的字符串)