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)

 

posted @   seven1986  阅读(37)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示