Python的re模块
Python的re模块
1、 compile(pattern):创建模式对象
import re
pat = re.compile('A')
m = pat.search('CBA')
#等价于re.search(‘A’,’CBA’)
print(m)
#<_sre.SRE_Match object; span=(2, 3), match='A'>
import re
pat = re.compile('a')
m = pat.search('CBA')
print(m) #没有匹配到,返回None
2、 search(pattern,string):在字符串中寻找模式
import re
m = re.search('asd','ASDasd')
print(m)
#<_sre.SRE_Match object; span=(3, 6), match='asd'>
上面的函数返回都可以在if条件语句中进行判断:
If pat.search(‘asd’,’ASDasd’):
Print(‘ok’)
运行输出了‘ok’。
3、 split(pattern,string):根据模式分割字符串,返回列表
a、
import re
m=re.split(',','a,s,d,asd') #以逗号为分界
print(m) #['a', 's', 'd', 'asd']
b、
import re
pat = re.compile(',')
m=pat.split('a,s,d,asd')
print(m) #['a', 's', 'd', 'asd']
c、
import re
m = re.split('[,]+','a,s,d ,,,,,asd')
#正则匹配:[,]+,后面说明
print(m) #['a', 's', 'd ', 'asd']
d、
import re
m= re.split('[,]+','a,s,d,e, ,,,,,asd',maxsplit=2)
#maxsplit最多分割次数
print(m)
#['a', 's', 'd,e, ,,,,,asd']
e、
import re
pat = re.compile('[,]+')
m = pat.split('a,s,d,e, ,,,,,asd',maxsplit=2)
print(m) # ['a', 's', 'd,e, ,,,,,asd']
4、 findall(pattern,string):列表形式返回匹配项
import re
c=re.findall('a','aASDaDSDa')
print(c) # ['a', 'a', 'a']
import re
pat = re.compile('a')
c = pat.findall('aASDaDSDa')
print(c) # ['a', 'a', 'a']
import re
pat = re.compile('[A-Z]+')
c = pat.findall('aASDaDSDa')
print(c) # ['ASD', 'DSD']
import re
pat = re.compile('[A-Z]')
c = pat.findall('aASDaDSDa')
print(c) # ['A', 'S', 'D', 'D', 'S', 'D']
import re
pat = re.compile('[A-Za-z]+')
#正则匹配:'[A-Za-z]+'匹配所有单词
c = pat.findall('aASD aDSDa')
print(c) # ['aASD', 'aDSDa']
import re
pat = re.compile('[A-Za-z]')
c = pat.findall('aASD aDSDa')
print(c)
#['a', 'A', 'S', 'D', 'a', 'D', 'S', 'D', 'a']
5、 sub(pat,repl,string):用repl替换pat匹配项
import re
c = re.sub('a','A','aASD aDSDa')
print(c) #AASD ADSDA
import re
pat = re.compile('a')
c = pat.sub('A','aASD aDSDa')
print(c) # AASD ADSDA
import re
pat = re.compile(r'www\.(.*)\..{3}')
'''
在Python的string前面加上‘r’,是为了告诉编辑器这个string是raw string,不要转译反斜杠‘\’。
例如,\n在raw string中,是两个字符,\和n,而不会转译为换行符。
由于正则表达式和\会有冲突,因此,当一个字符串使用了正则表达式后,最好在前面加上‘r’。
于大多数编程语言相同,正则表达式里用“\”作为转义字符,这就可能造成反斜杠困扰。
假如你需要匹配文本中的字符“\”,那么使用编程语言表示的正则表达式里将需要4个反斜杠“\\\\”:
前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。
Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r“\\”表示。
同样,匹配一个数字的\\d可以写成r“\d”。
有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。
最好记住这句话:
当一个字符串使用了正则表达式后,最好在前面加上‘r’,这样你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观
'''
ret = pat.match('www.dxy.com').group(1)
print(ret) # dxy
a=re.sub(r'www\.(.*)\..{3}',r'\1','hello,www.dxy.com')
print(a) # hello,dxy
b = pat.sub(r'\1','hello,www.dxy.com')
print(b) # hello,dxy
'''
r'\1'是第一组的意思
通过正则匹配找到符合规则的“www.dxy.com”,取得组1字符串去替换整个匹配
'''
pat = re.compile(r'(\w+)(\w+)')
s = 'hello world! hello hz!'
d = pat.findall('hello world ! hello hz !')
print(d)
# [('hell', 'o'), ('worl', 'd'), ('hell', 'o'), ('h', 'z')]
c=pat.sub(r'\2\1',s)
print(c) # ohell dworl! ohell zh!
'''
通过正则得到组1(hell),组2(o),再通过sub去替换。即组1替换组2,组2替换组1,调换位置
'''
6、 escape(string):对字符串里面的特殊字符串进行转义
import re
a=re.escape('www.dxy.com')
print(a) #www\.dxy\.com
7、group:获取子模式(组)的匹配项
上面的函数中,只有match、search有group方法,其他的函数没有。
import re
pat = re.compile(r'www\.(.*)\.(.*)')
#用()表示1个组,2个组
m = pat.match('www.dxy.com')
print(m.group())
#默认为0,表示匹配整个字符串。结果:www.dxy.com
print(m.group(1))
#返回给定组1匹配的字符串。结果:dxy
print(m.group(2))
#返回给定组2匹配的字符串。结果:com
8、 start:给定组匹配项的开始位置
import re
pat = re.compile(r'www\.(.*)\.(.*)')
m = pat.match('www.dxy.com')
print(m.start(2)) #组2开始的索引,结果:8
9、end:给定组匹配项的结束位置
import re
pat = re.compile(r'www\.(.*)\.(.*)')
m = pat.match('www.dxy.com')
print(m.end(2)) #组2结束的索引。结果:11
10、span:给定组匹配项的开始结束位置
import re
pat = re.compile(r'www\.(.*)\.(.*)')
m = pat.match('www.dxy.com')
print(m.span(2))
#组2的开始、结束的索引。结果为(8,11)