python正则

作者 新城 日期 2017-09-01
python正则

正则表达式

就是正则不作解释

  • ‘00\d’ 匹配 007 不能匹配 00a
  • ‘\d\d\d’ 匹配三位数字
  • ‘\w\w\d’ 匹配两位英文+一位数字
  • ‘.’ 匹配任意
  • ‘py.’ 匹配pyc,pyo,py!等 要匹配变长的字符串,在正则中用表示
    **’
    表示任意个字符 +** 表示至少一个字符
    解读’\d{3}\s+\d{3,8}’
    表示三个随意的数字 后面添加一个空白或者Tab按键 再添加3-8个数字

解读\d{3}-\d{3,8}
010-12345 因为-需要转移 所以使用\表示转义

进阶

  • [0-9a-zA-Z_] 表示 可以匹配一个数字字母或者下划线
  • [0-9a-zA-Z_]+ 以匹配至少由一个数字、字母或者下划线组成的字符串’a100’,’0_Z’,’Py3000’
  • [a-zA-Z_][0-9a-zA-Z_]* 可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量
  • [a-zA-Z_][0-9a-zA-Z_]{0, 19} 更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)

A|B 表示匹配A表达式或者B表达式 (P|p)ython 表示匹配Python 或者python

^表示开头 ^\d表示必须以数字开头
$表示结束 ^\d表示以数字结束

‘py’ 可以匹配python
^py$ 只能匹配py

re模块

python提供re模块 包含所有正则表达式功能

由于Python的字符串本身也用\转义,所以要特别注意:

1
2
3
s = 'ABC\\-001'  # Python的字符串
# 对应的正则表达式字符串变成:
# 'ABC\-001'

使用Python的r前缀,就不用考虑转义的问题了

1
2
3
s = r'ABC\-001' # Python的字符串
# 对应的正则表达式字符串不变:
# 'ABC\-001'

正则的使用

1
2
import re
re.match(r'\d{3}\-\d{3,8}$','010-12345')

匹配成功 match返回一个match对象 否则返回一个None

匹配格式

1
2
3
4
5
test = '用户输入的字符串'
if re.match(r'正则表达式', test):
print('ok')
else:
print('failed')

切分字符串

1
2
3
4
s = 'a b ;,  c'
print (list(s.split(' '))) # 输出 ['a', 'b', '', '', 'c']

print (re.split(r'[\s\,\;]+',s)) # 输出['a', 'b', 'c'] +表示至少一个空格

分组

除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(Group)

^(\d{3})-(\d{3,8})$分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码

1
2
3
4
5
a = '010-12345'
m = re.match(r'^(\d{3}-(\d{3,8}))$', a)
print(m.group(0))
print(m.group(1))
print(m.group(2))
1
2
3
t = '19:05:30'
m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$', t)
print(m.groups()) # 输出('19', '05', '30')

贪婪匹配

最后需要特别指出的是,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。举例如下,匹配出数字后面的0:

1
2
>>> re.match(r'^(\d+)(0*)$', '102300').groups()
('102300', '')

由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。

必须让\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配:

1
2
>>> re.match(r'^(\d+?)(0*)$', '102300').groups()
('1023', '00')

编译

当我们使用正则表达式的时候 re模块内部干了两件事

  1. 编译正则表达式,如果是错误的正则表达式 ,python会报错
  2. 使用编译以后的正则表达式去匹配字符串

假若一个正则表达式多次使用 则我们可以预编译 在后续的调用过程中不在编译 节省时间

1
2
3
4
5
import re       #导入模块

re_teltphone = re.compile(r'^(\d{3})-(\d{3,8})$') #编译正则

re_telephone.match('010-12345').groups() #使用正则