import re
# 示例字符串
s ="a1b2a2e2g3t54a1"# findall, 返回列表, 包含所有结果
r = re.findall(r"\d", s)print("findall result: ", r)# ['1', '2', '2', '2', '3', '5', '4', '1']# finditer, 返回可迭代对象, 包含所有结果, 需要遍历后调用 group()方法取值, 若没有匹配成功则可迭代对象为空
r = re.finditer(r"\d", s)for i in r:print(i.group())# 1, 2, 2, 2, 3, 5, 4, 1# search, 匹配符合条件的字符串, 返回第一个对象(group()取结果), 匹配不到返回none
r = re.search(r"\d", s)if r:print("search result: ", r.group())# 1# match, 匹配以条件开头的字符串, 返回第一个对象(group()取结果), 匹配不到返回none, 等价于 search(r"^...")
r = re.match(r"\d", s)if r:# none, 因为开头是字符不是数字print("match result: ", r.group())# fullmatch, 用于确认整个字符串是否符合正则要求, 不符合则返回 none
s ="123456"
flag = re.fullmatch(r"\d+", s)ifnot flag:
exit("字符串不符合正则要求")
分隔
import re
s ="a1a2a2a1"# 用匹配条件进行分隔, 返回分隔后的字符串, 不保留分隔符
r = re.split(r"[12]", s)print(r)# ['a', 'a', 'a', 'a', '']# 用匹配条件进行分隔, 返回分隔后的字符串, 保留分隔符
r = re.split(r"([12])", s)print(r)# ['a', '1', 'a', '2', 'a', '2', 'a', '1', '']
替换
import re
s ="a1a2a2a1"# 使用匹配条件进行替换, 返回字符串# 可接收4个参数(匹配条件, 替换字符, 待匹配字符串, 替换次数), 匹配个数不填默认全部替换# 第三个参数还可以为# re.S - 单行匹配# re.M - 多行匹配# re.I - 忽略大小写
r = re.sub(r"\d","-", s,3)print(r)# a-a-a-a1, 本例中确定了替换次数为3, 所以只替换了前三个# 使用匹配条件进行替换, 返回tuple, (字符串, 替换次数)
r = re.subn(r"\d","-", s)print(r)# ('a-a-a-a-', 4), 本例中替换了4次, 所以替换次数为4
高级用法
compile 编译(重复使用正则对象)
import re
s ="a1b1c1a2b2c2"# compile, 正则表达式编译成对象使用
reobj = re.compile(r"\d")
r = reobj.search(s)if r:print(r.group())
正则分组命名
import re
s ="192.168.248.80:999"# 嵌套分组 + 分组命名 + group("命名")
r = re.search(r"(?P<ip>(\d{1,3}\.){3}\d+):\d{1,3}", s)print(r.group("ip"))# 192.168.248.80