python模块之re(正则表达式)
正则表达式( re)是一种小型的、高度专业化的编程语言,它内嵌在Python中,并通过 re 模块实现。
字符匹配包括:普通字符,元字符
一 、普通字符:大多数字符和字母都会和自身匹配
import re
ret=re.findall('w\w{2}l','hello world')
print(ret) #['worl']
二 、元字符(11个): . ^ $ * + ? { } [ ] | ( ) \
1、. :通配符,代指任意一个字符,除了换行符,只要有就可以,位置任意
ret=re.findall('w..l','hello world')
print(ret) #['worl']
ret=re.findall('w..l','hello w\n ld')
print(ret) #[]匹配不成功
ret=re.findall('w..l','hello w\t ld')
print(ret) #['w\t l']
2、^:指对字符串的开始进行匹配
ret=re.findall('^w..l','hello world')
print(ret) #[]
ret=re.findall('^w..l','whello world')
print(ret) #['whel']
3、$:指从字符串后面匹配
ret=re.findall('a..x$','nagilkhilasgx')
print(ret) #['asgx']
4、 * :重复匹配,匹配*前面的字符0到无穷次,包括可以匹配0次
ret=re.findall('a.*li','hgiakalexlingak')#*重复前面的个数,代表前面字符、任意字符[0-n]
print(ret)
**注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配。**
ret=re.findall('jga*?','abjbvajgaaaaaaaaaaaaa')#*?,按照*最少的匹配进行匹配
print(ret) #['jg']
ret=re.findall('ba*','gnakogbaaaaaaa')
print(ret) #['baaaaaaa']
ret=re.findall('.*','gnakogbaaaaaaa')
print(ret) #['gnakogbaaaaaaa', ''],因为.*匹配0次
ret = re.findall('ab*','kjkjgadgab')
print(ret) #['a', 'ab']
5、+:重复匹配,指前面个字符,至少有一个字符
ret = re.findall('ab+','jkgkaabhhok') #['ab'],以ab为整体进行匹配
print(ret)
ret=re.findall('a+b','ghikaaaaaaaaaaaaabjgkjbgaa')
print(ret) #['aaaaaaaaaaaaab']
ret=re.findall('a.+b','ghikahfhjtyhbjgkjbgaa')
print(ret) #['ahfhjtyhbjgkjb']
6、?:[0,1]匹配前面可以有0或者1字符
ret=re.findall('a?b','ghikaaaahfabhjtyhbjgkjbgaa')
print(ret) #['ab', 'b', 'b']
7、{},重复匹配,相匹配多少个字符自己定
ret = re.findall('a{5}b','aaaaaab')
print(ret) #['aaaaab']
ret = re.findall('a{1,3}b','abaaaaab')#贪婪匹配
print(ret)#['ab', 'aaab']
ret = re.findall('a*b','abaaaaab')#贪婪匹配
print(ret)#['ab', 'aaaaab']
结论:*等于[0,正无穷] , +等价于[1,+正无穷],?等价于[0,1],{1,}等价于[1,正无穷]
8、[]:字符集
ret = re.findall('a[cd]x','acdx')
print(ret) #[]
ret = re.findall('a[cd]x','adxsafdx')
print(ret) #['adx']
ret = re.findall('a[c,d,e]x','aex')
print(ret) #['aex']
ret = re.findall('[a-z]','abx') #[a-z]表示一个范围
print(ret) #['a', 'b', 'x']
注意:[]字符集:取消元字符的特殊功能(\ ^ -)。
ret = re.findall('[w*]','aex')
print(ret) #[]
ret = re.findall('[w**]','awex*')
print(ret) #['w', '*']
ret = re.findall('[1-9,a-z,A-Z]','1adgX35AH*')
print(ret) #['1', 'a', 'd', 'g', 'X', '3', '5', 'A', 'H']
ret = re.findall('[1-9a-zA-Z]','1adgX35AH*')
print(ret) #['1', 'a', 'd', 'g', 'X', '3', '5', 'A', 'H']
ret = re.findall('^iu','iu1adgX35AH*')#^:指对字符串的开始进行匹配
print(ret)#['iu']
ret = re.findall('[^t]','1dtgX3')#^放在[]里,取反,[^t]取反,除了t以为其他都可以。
print(ret) #['1', 'd', 'g', 'X', '3']
ret = re.findall('[^4,5]','1d5tg4X3')#^是非得意思,非4或者非5
print(ret) #['1', 'd', 't', 'g', 'X', '3']
9、\ :1、反斜杠后边跟元字符去除特殊功能,2、反斜杠后边跟普通字符实现特殊功能。
\d 匹配任何十进制数,相当于[0,9]
\D 匹配任意非数字字符,相当于 非[0,9]
\s 匹配任意空白字符,相当于 [\t \n \r \f \v]
\S 匹配任意非空白字符,相当于 非[\t \n \r \f \v]
\w 匹配任意字母数字字符,相当于 [1-9a-zA-Z]
\W 匹配任意非字母数字字符,相当于 非[1-9a-zA-Z]
\b 匹配一个单词边界,也就是空格和单词间的位置
print(re.findall('\d{11}','fhaihf38783759475893')) #['38783759475']
print(re.findall('\D{11}','fhaihfJSYKSUS38783759475893')) #['fhaihfJSYKS']
print(re.findall('\shf','fhai hfJSYKSUS38783759475893')) #[' hf']
print(re.findall('\w','fhai')) #['f', 'h', 'a', 'i']
print(re.findall(r'am\b','hello ,I am a am$Iihsk')) #['am', 'am'],$是特殊字符
#匹配出第一个满足条件的结果
ret = re.search('ab','ikhahgiabjkaoab')
print(ret)#<_sre.SRE_Match object; span=(7, 9), match='ab'>
print(ret.group()) #利用group方法输出:ab
ret=re.search('a.','agjak').group()
print(ret) #ag
ret=re.search('a\.','agjak').group()
print(ret) #AttributeError: 'NoneType' object has no attribute 'group'
ret=re.search('a\.','a.gjak').group()#'a\.'其实就是.字符,已经取消特殊功能
print(ret) # a.
ret=re.search('a\+','a+gjak').group()
print(ret) #a+
ret=re.findall(r'\\','akjgia\e')
print(ret) #['\\']
ret = re.search(r'\bblow','blow')#r是原生字符串,不需要转义
print(ret.group()) #blow
10、():元字符之分组
print(re.search('(ab)','aghakababhgabsk').group()) #ab 一次匹配
print(re.search('(ab)+','aghakabababhgabsk').group()) ##abab,多次分组匹配,以()内作为分组。
print(re.search('(ab)|3','aghakhg3absk').group()) #3 ,先匹配谁就出来之后就不匹配了。
ret = re.search('(?P<id>\d{3})/(?P<name>\w{3})','fikag1234tgft123/gkjeo')#命名分组
print(ret.group()) #123/gkj
print(ret.group('id')) #123
print(ret.group('name')) #gkj
ret=re.findall('\v','adaghhadaf\v')
print(ret) #['\x0b']
ret=re.findall('\\v','adaghhadaf\v')
print(ret) #['\x0b']
ret=re.findall('\\\\','abcgkrjg\degankn')
print(ret) #['\\']
ret=re.findall(r'\\','abcgkr\jgdegankn')
print(ret) #['\\']
ret = re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city")
print(ret) #{'province': '3714', 'city': '81', 'birthday': '1993'}
ret = re.findall('www.(\w+).com','www.baidu.com')
print(ret) #['baidu']#把分组里组的内容取出,按照规则里的组,而不是输出这个地址
ret = re.findall('www.(?:\w+).com','www.baidu.com')#加?:取消组的优先级。
print(ret)
三、正则表达式的方法
1、findall():所有结果都返回到一个列表里
2、search():返回匹配到第一个对象(object),对象可以调用group()方法返回结果
3、match():只在字符串开始匹配
4、finditer()#迭代器
ret=re.match('aefesd','ajgiaasd')
print(ret) #None
ret=re.match('awfsd','awfsdjgiaasd')
print(ret) #<_sre.SRE_Match object; span=(0, 5), match='awfsd'>
print(ret.group()) #awfsd
ret=re.split('[o,h]','agoireihg')
print(ret) #['ag', 'irei', 'g']
ret=re.split('[o,h]','hagoireihg')
#先按o分完分为'hag'和ireihg,按h再分(前和后),先按前h分为''和'ag',再按后h分'irei'和'g
print(ret) #['', 'ag', 'irei', 'g']
#sub替换
ret = re.sub('a..x','sasb','hgskaahsxgaihg')#'sasb'替换a..x
print(ret) #hgskasasbgaihg
p = re.compile('\.com') #规则编译一次成为一个对象
ret=p.findall('higahig.comhgakhgai.comi')#通过调用对象的方法则可以进行匹配。
print(ret) #['.com', '.com']
ret = re.finditer('\d','hgs1kah2kjh356')
print(ret) #<callable_iterator object at 0x00000000022BD208>
print(next(ret)) #<_sre.SRE_Match object; span=(6, 7), match='1'>
print(next(ret).group()) #1 用group方法取出来。