python 正则
所有元字符:. ^ $ * + ? { } [ ] | ( ) \
元字符--简单元字符:. ^ $ * + ? { }
ret = re.findall('a..in', 'helloalvin') print(ret) # ['alvin'] 匹配单个任意字符 ret = re.findall('^a...n', 'alvinhelloawwwn') print(ret) # ['alvin'] 从开头匹配 ret = re.findall('a...n$', 'alvinhelloawwwn') print(ret) # ['awwwn'] 匹配到结尾 ret = re.findall('abc*', 'abcccc') # *匹配型号前面的c[0,+oo]次,贪婪匹配 print(ret) # ['abcccc'] ret = re.findall('abc+', 'abccc') # 贪婪匹配[1,+oo] print(ret) # ['abccc'] ret = re.findall('abc?', 'abccc') # 贪婪匹配[0,1] print(ret) # ['abc'] ret = re.findall('abc??', 'abccc') # [0,1] 加?号使其变成惰性匹配 print(ret) # ['ab'] ret = re.findall('abc{1,4}', 'abccc') #贪婪匹配, 贪婪匹配到所有c print(ret) # ['abccc'] ret = re.findall('abc{1,4}?', 'abccc') #括号表示1-4个,加?号使其变成惰性匹配 print(ret) # ['abc'] 惰性匹配后就只匹配了一个c
元字符之字符集[]: 中括号中所有字符都是或的关系
特点1:字符集中.*+都回归普通字符
特点2:有功能的符号: - ^ \
ret = re.findall('a[bc]d', 'acd abd') print(ret) # ['acd', 'abd'] 中括号,或关系 ret = re.findall('[a-z]', 'acd') print(ret) # ['a', 'c', 'd'] ret = re.findall('[1-9]', '45dha3') print(ret) # ['4', '5', '3'] #特点1 ret = re.findall('[.*+]', 'a.cd+') print(ret) # ['.', '+'] .*+都回归普通字符 特点2 ret = re.findall('[^ab]', '45bdha3') # ^表示不包含 print(ret) # ['4', '5', 'd', 'h', '3'] ret = re.findall('[\d]', '-45bdha3') #整正数字符集 print(ret) # ['4', '5', '3']
元字符之转义符\
反斜杠后边跟元字符去除特殊功能,比如\.
反斜杠后边跟普通字符实现特殊功能,比如\d
\d 匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s 匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。
\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
\b 匹配一个特殊字符边界,比如空格 ,&,#等 好像空格还行,其他没有试出来有啥效果
ret=re.findall('I\\b','I am LIST') #加上斜杠,将第二个斜杠转义为普通字符, print(ret)#[] ret=re.findall(r'I\b','I am LIST') #加上r,将引号内的字符转为 print(ret)#['I'] # ret=re.findall(r'c\l','abc\le') #报错 # ret=re.findall('c\\l','abc\le') #报错 #此处有两层转义,第一层将斜杠转成普通斜杠生成两个斜杠\\,目的是给python解释器;第二层,将第一层生成两个斜杠\\转义为普通斜杠,目的是给re模块 ret=re.findall('c\\\\l','abc\le') print(ret)#['c\\l'] ret=re.findall(r'c\\l','abc\le') #r直接将解释器这一层的转义给做了,所以只用一次斜杠转义就可以了 print(ret)#['c\\l']
元字符之分组()
# 元字符之分组() ret = re.findall('(ad)+', 'VVVadadTTTadVVV') #分组优先匹配所以+号没有起到什么作用 print(ret) #['ad', 'ad'] ret = re.findall('(?:ad)+', 'VVVadadTTTadVVV') #?:会取消分组优先匹配,所以匹配出来adad print(ret) #['adad', 'ad'] #给分组一个标签 # search()函数只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以 # 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None ret = re.search('(?P<id>\d{2})/(?P<name>\w{5})', '35/seven')#两个数字\5个字母 print(ret.group()) # 35/seven ret是一个组类型的对象,需要group()函数才能取出来 print(ret.group('id')) # 35 取单独的标签id print(ret.group('name')) #seven 取单独的标签name
元字符之| 管道符
ret=re.search('(ab)|\d','rabhdg8sd') print(ret.group())#ab group 只会返回第一个匹配到的 ret=re.findall('(?:ab)|\d','rabhdg8sd') #带上括号,记住要加上?:否则只输出括号匹配到的内容 print(ret)#[ab,8] ret=re.findall('ka|b','sdjka|bsf') print(ret)#[ab,8] #['baidu'] 默认优先取括号里的内容 fa=re.findall("www\.(baidu|163)\.com","asdfwww.baidu.comhilk") #['www.baidu.com'] ?: 表示去掉优先 fa=re.findall("www\.(?:baidu|163)\.com","asdfwww.baidu.comhilk") print(fa)
--------------------常用方法-------------------------------
查找并替换函数:sub() subn()
ret = re.sub('\d', 'AAA', 'alvin5yuan6ccc888', 2) #替换前两个,不过一般会全部替换,可不带数字 print(ret) # alvinabcyuan6 ret = re.subn('\d', 'AAA', 'alvin5yuan6ccc888') #全部替换并返回替换后的和替换次数 print(ret) # ('alvinAAAyuanAAAcccAAAAAAAAA', 5)
查找并返回可迭代对象 :finditer()
特点:可节省内存占用
ret = re.finditer('\d', 'ds1sy234a56adsfa78') print(ret) # <callable_iterator object at 0x10195f940> i=0 while i<8: print(next(ret).group()) i+=1
预设方法:compile()
obj = re.compile('\d{3}') ret = obj.search('abc123eeee') #匹配到则返回结果group对象,否则返回none print(ret.group()) # 123 #字符串计算器 #虽然可以使用eval()函数,但此处是为了练习字符串匹配 ss="12+(34*6+2-5*(2-1)+(4*4+4))" #计算器算出时233 def del_bracket(ss): '''去掉括号''' obj = re.compile('\([^()]+\)') #匹配括号里没有不包含括号的内容 ret = obj.search(ss) if ret: ret=ret.group() #不为none则继续剥离括号 ss_sub=str(eval(ret)) ss=obj.sub(ss_sub,ss,1) print(ss) #打印每次递归值结果 return del_bracket(ss) else: return eval(ss) #最后直接计算 print(del_bracket(ss))
--------------------不常用-------------------------------
# match()同search,只是从开始处进行匹配,后面的不管
#没有匹配到则返回none,none时就没有group()方法了,强行使用会报错
ret=re.match('a', 'abc').group() # print(ret) #a # ret=re.match('b', 'abc').group() #报错:'NoneType' object has no attribute 'group'
split() 匹配并分割
ret = re.split('ab', '0abcd') # a和b是一组,所以只用分一次 print(ret) # ['0', 'cd'] ret = re.split('[ab]', '0abcd') # 中括号中是列表的关系,所以遍历列表,先按'a'分割得到'0'和'bcd',再对'0'和'bcd'分别按'b'分割 print(ret) # ['0', '', 'cd'] ret = re.split('ff', '0abcd') # 没有匹配到则不分割 print(ret) #
实例1:提取字符串中两个特定字符中间的部分
import re key="-----BEGIN RSA PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsYc8bEQvROGH+rWn2zqr\nmPXzkLH224eQmkuRblbDqY69wb1IBzlW44UFlgLtJt7WMBs+DVL6ckDbpB/20V+2\nCnqx+cJSVtCCU6TdJXNBB+ujb8CJj9y/VUbYDnU4O2PogUkZfBgkS8nj+SVzygxt\nLjm1jb/QtFi/UhIy9GbHkQSur4w8lbZvlY/tKJsy3DnYx0poOmu7fTwZMF9dIrML\n12E6jwbQ9QQI5wgRTSji9FqLr142mRmzdmfbrlLLWK1PZXVSKAiieGSX6tMBe2r6\nNOH8MKS91ugh7Zl1OsssKEiT4Q8ZY0RrkzgMwTt1l76AtZIHWyNRbvWyXgTYJZDl\nwQIDAQAB\n-----END RSA PUBLIC KEY-----\n" func=r"-----BEGIN RSA PUBLIC KEY-----\n(.+?)\n-----END RSA PUBLIC KEY-----\n" key_cut_list=re.findall(func, key,re.S) key_cut_str=str(key_cut_list[0]) print(key_cut_str)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术