python 字符串的搜索匹配与替换(详细)

有误请指出,正在改动中…


python 内的正则使用基础

正则修饰符的使用

python 里的参数用 flag 表示正则修饰符的参数。
使用多个修饰符设置正则表达式的匹配模式:re.I | re.M

修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

python 里的反向引用

  1. 反向引用:反斜杠加数字(\N)
  2. (?<name>exp) 匹配 exp,并捕获文本到名称为 name 的组里,也可以写成 (?'name'exp)
    但是在Python中,为 (?P<name>exp)
  • 后续可使用 group(1)group(name) 获取元表达式的匹配内容。

> 有关于反向引用无效的问题

注意:反向引用需要前缀 r,否则会被 Python 误认为是进制数:比如 \1 实际意义变成 \x01


需求:单次匹配字符串

re.match() 函数

python 中的 match() ,需要这个字符串以这个正则表达式开头,【检验字符串开头有没有正确】。如果字符串开头有所不同就匹配失败,返回 none。(就是许多文章说的 “检测 RE 是不是在 string 的开始位置匹配”)

re.search() 函数

search() 是在整个字符串里部分匹配,【字符串里有没有这个的东西】。值得注意的是 search() 只会匹配一次

re.fullmatch() 函数

fullmatch():字符串完全匹配正则,字符串完全匹配正则【检验这个字符串是不是我们所要的东西】


需求:全文搜索替换字符串

re.sub() 函数

基本需求使用 replace(),当然这里都说了 re 模块了,复杂的替换应该使用 re.sub()。它会替换字符串里的所有匹配。

substitute
n. 代替者; 代替物; 代用品; 替补(运动员);
v. (以…) 代替; 取代;

re.sub(pattern, repl, string, count=0, flags=0)

pattern:正则表达式
repl:要替换成的字符串,可为函数
string:源字符串
count:最少要替换的次数
flag:正则表达式的匹配模式(切记不要给设置到count里,应写 flags=xxx

正则表达式修饰符 - 可选标志 | 菜鸟教程

# 将“\n3.”等换为“【3】”
oriStr = '\n3.这是第三点'
resStr = re.sub(r'\n(\d+)\.', r'\n【\1】', oriStr)
print(resStr)

【3】这是第三点


需求:全文搜索匹配字符串

re.findall()re.finditer() 函数

  1. re.findall(),返回所有匹配的一个列表
re.findall(pattern, string, flags=0)
pattern.findall(string[, pos[, endpos]])
import re
 
result1 = re.findall(r'\d+','runoob 123 google 456')
 
pattern = re.compile(r'\d+')   # 查找数字
result2 = pattern.findall('runoob 123 google 456')
result3 = pattern.findall('run88oob123google456', 0, 10)
 
print(result1)
print(result2)
print(result3)

输出结果:

[‘123’, ‘456’]
[‘123’, ‘456’]
[‘88’, ‘12’]

  1. re.finditer(),返回所有匹配的一个迭代器
re.finditer(pattern, string, flags=0)
import re
 
it = re.finditer(r"\d+","12a32bc43jf3") 
for match in it: 
    print (match.group())

12
32
43
3


需求:以匹配的字符分割字符串

re.split() 函数

将匹配的字符串作为 split 的字符,以其切割字符串返回列表

re.split(pattern, string[, maxsplit=0, flags=0])
>>>import re

>>> re.split('\W+', 'runoob, runoob, runoob.')
['runoob', 'runoob', 'runoob', '']

>>> re.split('(\W+)', ' runoob, runoob, runoob.') # 小括号表示保留这个分隔者
['', ' ', 'runoob', ', ', 'runoob', ', ', 'runoob', '.', ''

本文参考:Python3 正则表达式 | 菜鸟教程

猜你喜欢

转载自blog.csdn.net/zsq8187/article/details/109749945