Python正则表达式
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。
re 模块使 Python 语言拥有全部的正则表达式功能。
compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。
本章节主要介绍Python中常用的正则表达式处理函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | '.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行 '^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r "^a" , "\nabc\neee" ,flags = re.MULTILINE) '$' 匹配字符结尾,或e.search( "foo$" , "bfoo\nsdfsf" ,flags = re.MULTILINE).group()也可以 '*' 匹配 * 号前的字符 0 次或多次,re.findall( "ab*" , "cabb3abcbbac" ) 结果为[ 'abb' , 'ab' , 'a' ] '+' 匹配前一个字符 1 次或多次,re.findall( "ab+" , "ab+cd+abb+bba" ) 结果[ 'ab' , 'abb' ] '?' 匹配前一个字符 1 次或 0 次 '{m}' 匹配前一个字符m次 '{n,m}' 匹配前一个字符n到m次,re.findall( "ab{1,3}" , "abb abc abbcbbb" ) 结果 'abb' , 'ab' , 'abb' ] '|' 匹配|左或|右的字符,re.search( "abc|ABC" , "ABCBabcCD" ).group() 结果 'ABC' '(...)' 分组匹配,re.search( "(abc){2}a(123|456)c" , "abcabca456c" ).group() 结果 abcabca456c '\A' 只从字符开头匹配,re.search( "\Aabc" , "alexabc" ) 是匹配不到的 '\Z' 匹配字符结尾,同$ '\d' 匹配数字 0 - 9 '\D' 匹配非数字 '\w' 匹配[A - Za - z0 - 9 ] '\W' 匹配非[A - Za - z0 - 9 ] 's' 匹配空白字符、\t、\n、\r , re.search( "\s+" , "ab\tc1\n3" ).group() 结果 '\t' |
re.match函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
函数语法:
1 | re.match(pattern, string, flags = 0 ) |
函数参数说明:
实例1
1 2 3 | import re print (re.match( "www" , "www.baidu.com" ).span()) print (re.match( "baidu" , "www.baidu.com" )) |
执行结果:
1 2 | ( 0 , 3 ) None |
实例2
1 2 3 4 5 6 7 8 9 10 11 12 13 | import re line = "Cats are smarter than dogs" matchObj = re.match( '(.*) are (.*?) .*' ,line,re.M|re.I) if matchObj: print "matchObj.group(): " , matchObj.group() print "matchObj.group(1): " , matchObj.group( 1 ) print "matchObj.group(2): " , matchObj.group( 2 ) print "matchObj.groups(): " , matchObj.groups() else : print "No match!" |
执行结果:
1 2 3 4 | matchObj.group(): Cats are smarter than dogs matchObj.group( 1 ): Cats matchObj.group( 2 ): smarter matchObj.groups(): ( 'Cats' , 'smarter' ) |
re.search方法
re.search 扫描整个字符串并返回第一个成功的匹配。
函数语法:
1 | re.search(pattern, string, flags = 0 ) |
函数参数说明:
匹配成功re.match方法返回一个匹配的对象,否则返回None。
我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
实例1:
1 2 3 4 5 6 | #!/usr/bin/python # -*- coding: UTF-8 -*- import re print (re.search( 'www' , 'www.runoob.com' ).span()) # 在起始位置匹配 print (re.search( 'com' , 'www.runoob.com' ).span()) # 不在起始位置匹配 |
执行结果:
1 2 | ( 0 , 3 ) ( 11 , 14 ) |
re.match与re.search的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import re line = "Cats are smarter than dogs" matchObj = re.search( 'dogs' ,line,re.M|re.I) if matchObj: print "search----matchObj.group(): " , matchObj.group() else : print "No match!" matchObj = re.match( 'dogs' ,line,re.M|re.I) if matchObj: print "match----matchObj.group(): " , matchObj.group() else : print "No match!" |
执行结果:
1 2 | search - - - - matchObj.group(): dogs No match! |
检索和替换
Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。
语法:
1 | re.sub(pattern, repl, string, count = 0 , flags = 0 ) |
参数:
- pattern : 正则中的模式字符串。
- repl : 替换的字符串,也可为一个函数。
- string : 要被查找替换的原始字符串。
- count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
1 2 3 4 5 6 7 8 9 10 11 | import re phone = "2004-959-559 # 这是一个国外电话号码" # 删除字符串中的 Python注释 num = re.sub( '#.*' , "", phone) print "电话号码是: " , num # 删除非数字(-)的字符串 num = re.sub( '\D' , "", phone) print "电话号码是 : " , num |
执行结果:
1 2 | 电话号码是: 2004 - 959 - 559 电话号码是 : 2004959559 |
repl 参数是一个函数
以下实例中将字符串中的匹配的数字乘于 2:
1 2 3 4 5 6 7 8 9 | import re def double(matched): value = int (matched.group( 'value' )) print value return str (value * 2 ) s = 'A223D23SSS#2E23236' print (re.sub( '(?P<value>\d+)' , double, s)) |
运行结果:
1 | A446D46SSS #4E46472 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)