python 正则表达式
功能:用来匹配字符串,正则表达式也是由字符组成。
在进行数据处理时非常有用
'\d'可以匹配数字,
'\w'可以匹配字母或者数字
'\s'匹配一个空格
eg:'00\d'可以匹配'007'
'\d\d\d'可以匹配'010'
'\w\w\d'可以匹配'py3'
'.'可以匹配任意字符
eg: 'py.'可以匹配'pyc','pyo','py!'
'*'可以匹配任意个字符
'+'匹配至少一个字符
'?'匹配0个或1个字符
'{n}'表示n个字符
'{n,m}'表示n-m个字符
eg:'\d{3}\s+\d{3,8}'
'\d{3}':匹配三个数字
'\s+'匹配至少一个空格
'\d{3,8}':匹配3到8个数字
若有特殊字符如’-‘需要用’-‘进行转义
若要更精确的匹配,可以用[]表示范围
'[0-9a-zA-Z\_]' 匹配一个数字,字母或者下划线
'[0-9a-zA-Z\_]+' 匹配至少有一个数字,字母或者下划线组成的字符
'[a-zA-Z\_][0-9a-zA-Z\_]*' 匹配由字母或者下划线开头,任意接一个数字,字母或下划线组成的字符串(python的合法变量)
'[a-zA-Z\_][0-9a-zA-Z\_]{0,19}' 增加了变量长度的限制
'A|B' 匹配A或B
eg: '(P|p)ython'可以匹配'python'或'Python'
'^'表示行的开头 '^\d'必须以数字开头
'$'表示行的结束 '\d$'必须以数字结束
eg: '^py$'只能匹配'py'
re模块
python中的re模块提供所有正则表达式的功能,由于python本身也用’\’进行转义,所以可以使用python的r前缀,就不用考虑转义
eg:’ABC\-001’对应的转义字符串是’ABC-001’
r’ABC-001’对应转义字符串仍是’ABC-001’
import re
re.match(r'^\d{3}\-\d{3,8}$','010-12345')
#如果匹配成功,返回match对象,否则返回None
test='用户输入的字符串'
if re.match(r'正则表达式',test):
print('ok')
elif:
print('failed')
利用正则表达式,切分字符串
#正常情况是按空格切分,但是无法识别多个空格
>>> 'a b c'.split(' ')
['a', 'b', '', '', 'c']
>>> re.split(r'\s','a b c')
['a', 'b', '', '', '', 'c']
#利用正则表达式可以识别多个空格
>>> re.split(r'\s+','a b c')
['a', 'b', 'c']
#可以通过','或者';'与' '同时进行分割
>>> re.split(r'[\s\,\;]+','a,b;c d')
['a', 'b', 'c', 'd']
提取字串
利用’()’表示需要提取的分组group
eg: 从电话号码中分别提取区号和本地号码
m=re.match(r'^(\d{3})-(\d{3,8})$','010-12345')
>>> m.group(0)#group(0)表示原字符
'010-12345'
>>> m.group(1)#第一组()
'010'
>>> m.group(2)#第二组()
'12345'
>>> m=re.match(r'.{2,5}(\d.\d)"$','´óÆÁ5.5"')#提取5.5
>>> m.group(1)
'5.5'
>>> m=re.match(r'.{2,5}(\d.\d+)"{1,3}$','"中屏5.15"""')
>>> m.group(1)
'5.15'
贪婪匹配
正则表示法尽可能多的匹配字符,例如果要匹配出数字后面的’0’
re.match(r'^(\d+)(0*)$','102300').group()
由于’\d+’采用贪婪匹配,后面的0全部匹配了,’0*’只能匹配空
re.match(r'^(\d+?)(0*)$','102300').group()
\d+?’尽量少的匹配,可以把后面的0匹配出来
编译:
如果一个正则表达式要使用几千次,出于效率考虑,应该预编译表达式
import re
#预编译
re_telephone = re.compile(r'(\d{3})-(\d{3,8})$')
#使用
re_telephone.match('010-12344').group(1)
#有了预编译,对应调用时就不用写正则表达式了。
参考:廖雪峰python教程