Python正则表达式基础用法与常用函数详解

Oliver
Oliver
发布时间:2026-10-13 | 2人浏览过
原创

本文系统介绍了Python中正则表达式的基本用法。详细解析了re模块中的核心函数,包括match与search的区别、sub与subn的替换操作、findall与finditer的提取方式,以及split和escape辅助函数的应用。通过具体代码示例,帮助开发者掌握文本处理、日志分析及数据清洗中的正则技巧。

本文汇总了Python中正则表达式的基础使用方法,旨在为读者提供实用的参考指南。

在进行文本处理任务时,例如爬虫解析HTML字段或从日志文件中提取关键数据,正则表达式是不可或缺的工具。通常我们会依赖Python的re库来实现。若某个正则表达式在代码中频繁出现,建议使用re.compile将其编译为对象,以便提高调用效率和代码可读性。

match函数

该函数尝试从字符串的起始位置进行匹配。如果起始字符无法匹配正则规则,则直接返回None。

search函数

与match不同,search函数会在字符串中扫描,寻找第一个匹配的位置,无论该位置是否位于字符串开头,一旦找到匹配项即停止并返回结果。

re模块中的标志位(Flags)

在调用正则函数时,通常可以通过flag参数来设置特定的匹配行为。

re.I:忽略大小写匹配。 re.L:启用本地化识别,使\w、\W、\b、\B、\s和\S依据当前locale设置进行匹配。 re.M:支持多行匹配模式。 re.DEBUG:开启调试模式,显示正则表达式的编译信息。 re.S:使点号(.)匹配包括换行符在内的所有字符。

sub替换函数

import re
phone='188-88-88 # this is my phone number'
num = re.sub(r'#.*$','',phone)
# num ==188-88-88
num = re.sub(r'\D','',phone)
# num = 1888888

该函数可用于执行查找和替换操作,类似于代码编辑器中的查找替换功能。例如,可以将C语言中的宏定义转换为Lua语言中的变量定义格式。

import re
print( re.sub( r'#define\s+([a-zA-Z_]+)\s+([a-zA-Z_0-9]+)', r'_G.\1 = \2', '#define MAX_RECV_SIZE 100' ) )
#_G.MAX_RECV_SIZE = 100

subn函数与sub类似,但其额外返回一个整数,表示实际执行的替换次数,允许用户定制替换的数量。

findall函数

该函数返回所有匹配到的子串,结果为一个列表。这是提取数据时最常用的方法之一。

print( re.findall( '\d+', '66,88,88,777' ) )
# ['66', '88', '88', '777']

finditer函数

与findall不同,finditer返回一个迭代器,每次迭代产生一个MatchObject对象。通过循环遍历该迭代器,可以获取更详细的匹配信息。

for num in re.finditer( '\d+', '66,88,88,777' ):
 print num.group()
'''
66
88
88
777
'''

split函数

re.split(pattern, string, maxsplit=0, flags=0) 
>>> re.split(',', 'Words, words, words.')
['Words', ' words', ' words.']
>>> re.split('\W+', 'Words, words, words.')
['Words', 'words', 'words', '']
>>> re.split('(\W+)', 'Words, words, words.')
['Words', ', ', 'words', ', ', 'words', '.', '']

大写的\W表示非字母数字字符,具体定义可查阅相关语法文档。如果在正则表达式中使用了括号(捕获组),匹配到的分隔符也会被保留在返回的列表中。例如,使用逗号作为分隔符时,逗号本身会作为字符串元素保留在结果数组中。

escape函数

这是一个辅助函数。当编写复杂的正则表达式时,如果某些固定字符串中包含了正则保留字符,但不希望它们被解释为正则语法,可以使用escape函数将这些字符串进行转义处理。

re.escape('1234@gmail.com')
# result
1234\\@gmai\\.com

正则语法备注:

模式 描述
^ 匹配字符串的开头
$ 匹配字符串的末尾。
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[…] 用来表示一组字符,单独列出:[amk] 匹配 ‘a','m'或'k'
[^…] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re* 匹配0个或多个的表达式。
re+ 匹配1个或多个的表达式。
re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式re{ n}
re{ n,} 精确匹配n个前面表达式。
re{ n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式a
(re) G匹配括号内的表达式,也表示一个组
(?imx) 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx) 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re) 类似 (…), 但是不表示一个组
(?imx: re) 在括号中使用i, m, 或 x 可选标志
(?-imx: re) 在括号中不使用i, m, 或 x 可选标志
(?#…) 注释.
(?= re) 前向肯定界定符。如果所含正则表达式,以 … 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re) 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?> re) 匹配的独立模式,省去回溯。
\w 匹配字母数字
\W 匹配非字母数字
\s 匹配任意空白字符,等价于 [\t\n\r\f].
\S 匹配任意非空字符
\d 匹配任意数字,等价于 [0-9].
\D 匹配任意非数字
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。c
\z 匹配字符串结束
\G 匹配最后匹配完成的位置。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b' 可以匹配”never” 中的 ‘er',但不能匹配 “verb” 中的 ‘er'。
\B 匹配非单词边界。'er\B' 能匹配 “verb” 中的 ‘er',但不能匹配 “never” 中的 ‘er'。
\n, \t, 等. 匹配一个换行符。匹配一个制表符。等
\1…\9 匹配第n个分组的子表达式。
\10 匹配第n个分组的子表达式,如果它经匹配。否则指的是八进制字符码的表达式。

此外,推荐以下两款实用的正则表达式在线工具供参考:

JavaScript正则表达式在线测试工具: http://tools.jb51.net/regex/javascript

正则表达式在线生成工具: http://tools.jb51.net/regex/create_reg

如需了解更多Python相关知识,可查阅本站系列文章:《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》。

希望本文的内容能对您的Python编程实践有所帮助。

本站声明

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

Python 相关产品和应用

全部下载

专题列表