Python re模块详解:从基础匹配到高级正则表达式应用

认真发呆
认真发呆
发布时间:2026-10-15 | 5人浏览过
原创

本文深入解析Python中re模块的核心功能,涵盖常用方法如match、search、findall及finditer的区别。详细讲解元字符、多字符匹配规则(贪婪与非贪婪)、分组匹配及边界匹配,并通过代码示例演示数据验证、文本替换与子串提取的实际应用场景。

一、re是什么?

正则表达式是一种特殊的字符序列,用于高效地检查字符串是否符合特定模式。Python的re模块提供了完整的正则表达式支持,使开发者能够轻松实现复杂的字符串匹配任务。

二、re 模块的作用

利用正则表达式,可以实现以下功能: 1. 模式测试:例如验证输入字符串中是否包含电话号码或信用卡号格式,这属于数据验证范畴。 2. 文本替换:识别文档中的特定文本,将其完全删除或替换为其他内容。 3. 子串提取:根据特定模式从字符串或输入域中查找并提取所需文本。

三、re模块的使用

1、常用方法

  • findAll(): 匹配字符串中所有符合模式的子串,并将结果以列表形式返回。
  • match(): 仅匹配字符串起始位置的模式,若起始位置不匹配则返回None。
  • search(): 在字符串中搜索,返回第一个匹配到的结果。
  • finditer(): 匹配字符串中所有符合模式的子串,返回一个迭代器,便于逐个处理匹配结果。

2、 元字符

匹配任意单个字符(换行符\n除外)。例如,'h.'表示匹配字符'h'后紧跟的任意一个字符。

import re
res = 'h.'
s = 'hello python'
result = re.findall(res, s)
print(result)  # ['he', 'ho']

使用方括号[]指定字符集,从字符串中匹配集合内的任意字符,每匹配到一个字符即加入结果列表,最终返回包含所有匹配字符的列表。

import re
res2 = '[hon]'
s = 'hello python'
result = re.findall(res2, s)
print(result)  # ['h', 'o', 'h', 'o', 'n']

\d 用于匹配数字字符(0-9)。

import re
res2 = '[\d]'
s = 'hell666o pyt999hon'
result = re.findall(res2, s)
print(result)  # ['6', '6', '6', '9', '9', '9']

\D 用于匹配非数字字符,包括空格在内的所有非数字内容。

import re
res2 = '[\D]'
s = 'hello 3334 python 88'
result = re.findall(res2, s)
print(result)  # ['h', 'e', 'l', 'l', 'o', ' ', ' ', 'p', 'y', 't', 'h', 'o', 'n', ' ']

'\s' 用于匹配空白字符(如空格、制表符、换行符等)。

import re
res2 = '[\s]'
s = 'hello 3334 python 88'
result = re.findall(res2, s)
print(result)  # [' ', ' ', ' ']

'\S' 用于匹配非空白字符。

import re
res2 = '[\S]'
s = 'hello 3334 python 88'
result = re.findall(res2, s)
print(result)  # ['h', 'e', 'l', 'l', 'o', '3', '3', '3', '4', 'p', 'y', 't', 'h', 'o', 'n', '8', '8']

\w 用于匹配非特殊字符,包括大小写字母(a-z, A-Z)、数字(0-9)、下划线(_)以及汉字。

import re
res2 = '[\w]'
s = 'hello#&_ aa 8python中国'
result = re.findall(res2, s)
print(result)  # ['h', 'e', 'l', 'l', 'o', '_', 'a', 'a', '8', 'p', 'y', 't', 'h', 'o', 'n', '中', '国']

\W 用于匹配特殊字符,包括符号(如 - ~@#$&*)以及空格。

import re
res2 = '[\W]'
s = '-hello#&_ aa 8python中国'
result = re.findall(res2, s)
print(result)  # ['-', '#', '&', ' ', ' ']

3、多字符匹配

(1) *:匹配前一个字符出现一次或无限次,默认采用贪婪模式。

import reres2 = 'h*'s = '-hhello hhh python'result = re.findall(res2, s)print(result)  #['', 'hh', '', '', '', '', '', 'hhh', '', '', '', '', 'h', '', '', '']import re
res2 = 'h*'
s = '-hhello hhh python'
result = re.findall(res2, s)
print(result)  #['', 'hh', '', '', '', '', '', 'hhh', '', '', '', '', 'h', '', '', '']

(2) +:匹配前一个字符出现一次或无限次。

import re
res2 = 'h+'
s = '-hhello hhh python'
result = re.findall(res2, s)
print(result) # ['hh', 'hhh', 'h']

(3) ?:匹配前一个字符出现0次或1次,默认采用非贪婪模式。

import re
res2 = 'h?'
s = '-hhello hhh python'
result = re.findall(res2, s)
print(result) # ['', 'h', 'h', '', '', '', '', '', 'h', 'h', 'h', '', '', '', '', 'h', '', '', '']

(4) {n}:精确匹配前一个字符连续出现n次。

import re
res2 = 'https{2}'
s = '-hhello-httpssss-python'
result = re.findall(res2, s)
print(result) # ['httpss'] 
匹配到前一个字符s 连续出现2次

{n,m}:匹配前一个字符出现次数在n到m次之间。

import re
res2 = 'https{1,3}'
s = '-hhello-httpssss-python'
result = re.findall(res2, s)
print(result) # ['httpss']

(5) 贪婪模式和非贪婪模式

正则表达式主要用于查找匹配字符串。贪婪模式会尝试匹配尽可能多的字符;而非贪婪模式则相反,尝试匹配尽可能少的字符。在量词('*', '?', '+', '{m,n}')后添加'?'可将贪婪模式转换为非贪婪模式。

(6) |:表示逻辑或,匹配两个条件中的任意一个。

import re
res2 = 'he|ll'
s = 'hello python'
result = re.findall(res2, s)
print(result) # ['he', 'll']

(7) 边界值:

^:用于匹配以指定字符开头的字符串。

import re
res2 = '^he'
s = 'hello python'
result = re.findall(res2, s)
print(result) # ['he']

$:用于匹配以指定字符结尾的字符串。

import re
res2 = 'on$'
s = 'hello python'
result = re.findall(res2, s)
print(result) # ['on']

4、分组匹配

使用圆括号()定义分组,仅匹配括号内的内容,便于提取特定子串。

import re
res2 = '#(\w.+?)#'
s = "{'mobile_phone':'#mobile_phone#','pwd':'Aa123456'}"
result = re.findall(res2, s)
print(result)  # ['mobile_phone']

5、match()方法的使用

str = "www.runoob.com"
print(re.match('www', str).span())  # 在起始位置匹配 ,返回匹配到的区间下标  (0,3)
print(re.match('com', str))  # 不在起始位置匹配  None

6、 search():在字符串中搜索,返回搜索到的第一个

str = "www.runoob.com"
print(re.search('www', str).span())  # 在起始位置匹配 ,返回匹配到的区间下标
print(re.search('com', str).span())  # 不在起始位置匹配

re.match仅从字符串起始位置开始匹配,若起始部分不符合正则表达式则匹配失败并返回None;而re.search会扫描整个字符串,直到找到第一个匹配项为止。

7、 finditer():

匹配字符串中所有符合模式的子串,返回一个迭代器。其功能与findall类似,但finditer返回的是匹配对象的迭代器,允许逐个访问匹配结果。

res = 'h.'
s = 'hello python'
result = re.finditer(res, s)
for str in result:
    print(str.group())
he
ho

总结

本文介绍了Python re模块的基本用法和核心概念,希望能为读者提供有价值的参考。欢迎持续关注本站以获取更多技术内容!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表