re模块
re模块用于python中的正则匹配,处理简单的字符串函数无法处理的模糊匹配和复杂匹配
re模块主要分为两部分,第一部分是正则规则,主要包含一些特殊字符,第二部分是re模块下的函数,主要是搜索,分割等等函数
正则规则
元字符:. ^ $ * + ? { } [ ] | ( )
每个元字符的意义如下:
import re
# . 代表一个任意字符
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']
# * 代表匹配0-多个前一个字符,前一个字符当做标志,不参与实际匹配
ret=re.findall('abc*','abcccc')#贪婪匹配[0,+oo]
print(ret)#['abcccc']
# + 匹配1-多个字符,和*类似
ret=re.findall('abc+','abccc')#[1,+oo]
print(ret)#['abccc']
# ? 匹配0或者1个字符
ret=re.findall('abc?','abccc')#[0,1]
print(ret)#['abc']
# t{x,y},代表匹配x<num<y个t,t{x}代表匹配x个t
ret=re.findall('abc{1,4}','abccc')
print(ret)#['abccc'] 贪婪匹配
#上述匹配都是贪婪匹配,即匹配最长子串,如果想匹配最短子串,可以在后面加个?
ret=re.findall('abc*?','abcccccc')
print(ret)#['ab']
#------------------------
#字符集[],选择字符集中的一个字符,
ret=re.findall('a[bc]d','acd')
print(ret)#['acd']
# - 代表范围
ret=re.findall('[a-z]','acd')
print(ret)#['a', 'c', 'd']
#^代表不选择字符集中的字符,
ret=re.findall('[^ab]','45bdha3')
print(ret)#['4', '5', 'd', 'h', '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 匹配一个特殊字符边界,比如空格 ,&,#等
注意,由于python解释器自带一部分的正则语法,同时也认识 \ 这个转义字符,因此如果想将转义字符传递至re的处理逻辑中,首先应该让python解释器不处理这个 \ ,也就是再加一个 \ .例如下面的例子:
import re
ret=re.findall('c\l','abc\le')
print(ret)#[]
ret=re.findall('c\\l','abc\le')
print(ret)#[]
ret=re.findall('c\\\\l','abc\le')
print(ret)#['c\\l'] #python解释器在显示的时候也会对\ 转义,以表明其特殊性,因此输出中有两个\
ret=re.findall(r'c\\l','abc\le')
print(ret)#['c\\l']
()和|
m = re.findall(r'(ad)+', 'add')
print(m)
#在()里面加上?P<xxxx>可以在分析字符串的时候产生一个结构体或者字典,可以通过xxx直接得到想要的内容
ret=re.search('(?P<id>\d{2})/(?P<name>\w{3})','23/com')
print(ret.group())#23/com
print(ret.group('id'))#23
# | 或,选择二者之一
ret=re.search('(ab)|\d','rabhdg8sd')
print(ret.group())#ab
方法
import re
#返回所有满足匹配条件的结果,放在列表里
re.findall('a','alvin yuan')
#函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
# 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
re.search('a','alvin yuan').group()
#同search,不过尽在字符串开始处进行匹配
re.match('a','abc').group()
#先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
ret=re.split('[ab]','abcd')
print(ret)#['', '', 'cd']
#返回替换后的字符串,可以限制和查看替换次数
ret=re.sub('\d','abc','alvin5yuan6',1)
print(ret) #alvinabcyuan6
ret=re.subn('\d','abc','alvin5yuan6')
print(ret) #('alvinabcyuanabc', 2)
#编译一个常用的正则表达式,加快批量处理的速度
obj=re.compile('\d{3}')
ret=obj.search('abc123eeee')
print(ret.group())#123
#返回迭代器,当返回的数据量非常大时,列表非常占内存,因此返回迭代器可以节省内存
ret=re.finditer('\d','ds3sy4784a')
print(ret) #<callable_iterator object at 0x10195f940>