python正则表达式
re.search方法
re.search 扫描整个字符串并返回第一个成功的匹配
函数语法:
re.search(pattern, string, flags=0)
参数说明:
参数 | 描述 |
pattern | 匹配的正则表达式 |
string | 要匹配的字符串 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等 |
匹配成功re.search方法返回一个匹配的对象,否则返回None。
正则匹配常用通配符
(1)字符串"\d"匹配0~9之间的一个数值
实例:
import re reg = r'\d' a = re.search(reg,'adc1234dfg') print(a) print(a.group())
输出:
<re.Match object; span=(3, 4), match='1'> 1
(2)字符"+"重复前面一个匹配字符一次或者多次
实例:
import re reg = r'\d+' a = re.search(reg,'adc1234dfg') print(a) print(a.group())
输出:
<re.Match object; span=(3, 7), match='1234'> 1234
(3)字符"*"重复前面一个匹配字符零次或者多次
实例:
import re reg1 = r'ab+' reg2 = r'ab*' a = re.search(reg1,'adcabbd') b = re.search(reg2,'adcabbd') print(a) print(a.group()) print(b) print(b.group())
输出:
<re.Match object; span=(3, 6), match='abb'> 使用正则表达式'ab+'匹配的结果为:abb <re.Match object; span=(0, 1), match='a'> 使用正则表达式'ab*'匹配的结果为:a
与字符"+"的区别:
可见r'ab+'匹配的是'abb',而'ab*'匹配的是'a',这是由于'+'需要求'b'字符出现1次或多次,而'*'要求'b'字符出现0次或多次
(4)字符"?"重复前面一个匹配字符零次或者一次
实例:
import re reg1 = r'ab?' a = re.search(reg1,'abbbcd') print(a) print(f"使用正则表达式'ab?'匹配的结果为:{a.group()}")
输出:
<re.Match object; span=(0, 2), match='ab'> 使用正则表达式'ab?'匹配的结果为:ab
#匹配结果"ab”,虽然字符串中'b'重复了3次,但是'?'表示匹配字符零次或者一次
(5)字符"."匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符
实例:
import re
reg1 = r'ab.'
a = re.search(reg1,'abcbcd')
print(a)
b = re.search(reg1,'ab\nbcd')
print(b)
c = re.search(reg1,'ab\nbcd',re.DOTALL)
print(c)
输出:
<re.Match object; span=(0, 3), match='abc'>
None
<re.Match object; span=(0, 3), match='ab\n'>
可见未使用re.DOTALL时不能匹配\n换行符
(6)"|"代表把左右分成两个部分
实例:
import re reg1 = r'ab|ba' a = re.search(reg1,'abcbcd') print(a) b = re.search(reg1,'acbacd') print(b)
输出:
<re.Match object; span=(0, 2), match='ab'> <re.Match object; span=(2, 4), match='ba'>
可见匹配'ab'与'ba'都可以
(7)特殊字符使用反斜杠"“引导,例如”\r"、"\n"、"\t"、"\"分别表示回车、换行、制表符号与反斜线自己本身
实例:
import re reg1 = r'a\nb' a = re.search(reg1,'a\nbc') print(a)
输出:
<re.Match object; span=(0, 3), match='a\nb'>
(8)字符"\b"匹配一个单词边界,也就是指单词和空格间的位置
实例:
import re reg1 = r'th\b' reg2 = r'on\b' a = re.search(reg1,'python') print(a) b = re.search(reg2,'python') print(b)
输出:
None <re.Match object; span=(4, 6), match='on'>
可见'th'不是"python"字符串的结尾,而'on'才是结尾字符串
(9)"[]"中的字符是任选择一个,如果字符ASCll码中连续的一组,那么可以使用"-"字符连接,例如[0-9]表示0-9的其中一个数字,[A-Z]表示A-Z的其中一个大写字符,[0-9A-z]表示0-9的其中一个数字或者A-z的其中一个大写字符
实例:
import re reg1 = r'[0-9]+' a = re.search(reg1,"'Donovan's number is 1234567890") print(a) print(a.group())
输出:
<re.Match object; span=(21, 32), match='1234567890'> 1234567890
结合前面的知识,动动小脑筋,这里还有没有其它方法匹配出电话号码?
(10)"^"出现在[]的第一个字符位置,就代表取反,例如[ ^ab0-9]表示不是a、b,也不是0-9的数字
注意:这里所说的是出现在"[]"中
实例:
import re reg1 = r'c[^ab0-9]t' a = re.search(reg1,"catc1tcrt") print(a) print(a.group())
输出:
<re.Match object; span=(6, 9), match='crt'> crt
(11)"^"匹配字符串的开头,例如"^ab"表示匹配以"ab"开头的字符串
注意:这里所说的是非出现在"[]"中
实例:
import re reg1 = '^ab' a = re.search(reg1,"cab") b = re.search(reg1,"abc") print(a) print(b)
输出:
None <re.Match object; span=(0, 2), match='ab'>
(12)"\s"匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]
实例:
import re reg1 = 'a\sb' a = re.search(reg1,"a bcd") b = re.search(reg1,"acb") print(a) print(b)
输出:
<re.Match object; span=(0, 3), match='a b'> None
(13)"\S"匹配任何非空白字符。等价于 [^ \f\n\r\t\v]
实例:
import re reg1 = 'a\Sb' a = re.search(reg1,"a bcd") b = re.search(reg1,"acb") print(a) print(b)
输出:
None <re.Match object; span=(0, 3), match='acb'>
(14)"$"字符比配字符串的结尾位置
实例:匹配以"ab"结尾的字符串
import re reg1 = r'ab$' a = re.search(reg1,"abcdac") b = re.search(reg1,"abcdab") print(a) print(b)
输出:
None <re.Match object; span=(4, 6), match='ab'>
(15)"\w"匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]
实例:
import re reg1 = r'\w+' a = re.search(reg1,"python_is 666") print(a) print(a.group())
输出:
<re.Match object; span=(0, 9), match='python_is'> python_is
re.match函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none
函数语法与参数与search类似
re.match与re.search的区别
re.match 只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None,而 re.search 匹配整个字符串,直到找到一个匹配。
实例:
import re s= 'abcdefg' a = re.match(r'cd',s) print(a) b = re.search(r'cd',s) print(b)
输出:
None <re.Match object; span=(2, 4), match='cd'>
re.finall
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。
注意:match 和 search 是匹配一次 findall 匹配所有。
语法:
re.findall(pattern, string, flags=0)
实例:
import re result1 = re.findall(r'\d+', 'runoob 123 google 456') result2 = re.search(r'\d+', 'runoob 123 google 456') print(result1) print(result2.group())
输出:
['123', '456'] 123
re.sub
Python的re模块提供了re.sub用于替换字符串中的匹配项。
语法:
re.sub(pattern,repl,string,count=0,flags=0)
参数:
参数 | 描述 |
pattern | 正则中的模块字符串 |
repl | 替换的字符串,也可为一个函数 |
string | 要被查找替换的原始字符串 |
count | 模式匹配后替换的最大次数 默认0表示替换所有匹配 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等 |
实例:
import re phone = "2004-959-559 # 这是一个电话号码" # 删除注释 num = re.sub(r'#.*$', "", phone) print ("电话号码 : ", num) # 移除非数字的内容 num = re.sub(r'\D', "", phone) print ("电话号码 : ", num)
输出:
电话号码 : 2004-959-559
电话号码 : 2004959559
扩展:
(1)\1....\9:匹配第n个分组的内容
import re s = '2017-11-27' print(re.sub('(\d{4})-(\d{2})-(\d{2})',r'\2-\3-\1', s))
输出:
11-27-2017
(2)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix