Python正则表达式教程_字符串匹配与替换实战

16次阅读

python正则表达式重在实践应用:需掌握基础匹配(数字、邮箱、中文)、贪婪/懒惰匹配、大小写控制、分组捕获(含命名与非捕获)、替换技巧(含函数替换)及调试避坑(如raw字符串、match/search区别、编译优化)。

Python正则表达式教程_字符串匹配与替换实战

Python正则表达式不是“学了就会”,而是“用对才懂”。掌握核心语法、理解匹配逻辑、避开常见坑,比背熟所有元字符更重要。下面从实际需求出发,讲清楚怎么写、怎么调、怎么修。

基础匹配:从找数字、邮箱到中文

正则本质是“描述文本模式的规则”。比如找连续3位数字:d{3};找邮箱:[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,};匹配中文(Unicode):[u4e00-u9fff]+

  • 注意贪婪 vs 懒惰:默认*+是贪婪匹配,会尽可能多匹配。想匹配最短内容,加?,如a.*?b匹配”a123b”中的整个串,但遇到”a123b456b”时只取第一个”a123b”
  • 中文匹配别漏范围u4e00-u9fff覆盖常用汉字,但生僻字、标点(如顿号、省略号)需扩展,例如加上u3000-u303fu3040-u309fu30a0-u30ff
  • 大小写敏感默认开启:用re.IGNORECASE(?i)前缀,如(?i)python能匹配”Python”、”PYTHON”

分组与捕获:提取关键信息的关键

用圆括号()定义分组,配合re.search()re.findall()提取结构化内容。比如解析日志行:"[2023-05-12 14:23:08] Error: timeout"

pattern = r"[(d{4}-d{2}-d{2} d{2}:d{2}:d{2})] (w+): (.*)"

立即学习Python免费学习笔记(深入)”;

  • group(0)是整个匹配结果,group(1)group(2)对应第一、二个括号里的内容
  • 命名分组更易读:写成(?P(?P...),之后用m.group("time")直接取值
  • 非捕获分组节省资源:只分组不捕获用(?:...),比如匹配IP但不单独提取每一段:(?:d{1,3}.){3}d{1,3}

替换操作:不只是简单替换,还能动态处理

re.sub()支持字符串、函数甚至Lambda作为替换内容。例如把日期格式2023/05/12转为2023-05-12

re.sub(r"(d{4})/(d{2})/(d{2})", r"1-2-3", text)

  • 反向引用要小心:在替换字符串中用12;若用re.sub(..., lambda m: ...),则通过m.group(1)获取
  • 函数替换更灵活:比如把所有数字加100:re.sub(r"d+", lambda m: str(int(m.group()) + 100), text)
  • 限制替换次数:加count=1参数,只替换第一次出现的位置

调试与避坑:为什么我的正则不生效?

常见问题往往出在细节:

  • 字符串前加r避免转义干扰:写r"d+",而不是"\d+",否则容易少一个反斜杠
  • match()只从开头匹配,search()才全局找:想确认是否包含某模式,用re.search();想验证整串是否符合规则,用re.fullmatch()
  • 特殊字符未转义就当字面量用:比如匹配真实句号,必须写.,否则.表示“任意字符”
  • 编译正则提升性能:多次使用同一模式时,先pattern = re.compile(r"..."),再调用pattern.search()pattern.sub()
text=ZqhQzanResources