正则表达式是对字符串操作的一种逻辑公式,用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
在正则表达式中,
若直接给出字符,就是精确匹配。
d 匹配一个数字,如 ‘00d’ 可匹配 ‘004’ 而不能匹配 ‘00a’
w 匹配一个数字或字母 如 ‘wwd’ 可匹配 ‘fg5’
. 可匹配任一字符,如 ‘py.’ 可匹配 ‘pyd’、‘py7’、‘py!’等
匹配变长字符,
* 表示任意个字符(含0个)
+ 表示至少一个字符
?表示0个或1个字符
{n}表示n个字符,{n,m}表示n到m个字符。
例:d{3}s+d{3,8} d{3}表示匹配3个数字;s表示匹配一个空格(含Tab等空白符),因此s+表示至少有一个空格;d{3,8}表示3-8个数字。若要匹配‘010-12345’,因为‘-’是特殊字符,在正则表达式中要用‘’转义,即d{3}-d{3,8}。但是,仍然无法匹配‘010 - 12345’,因为带有空格。需要更复杂的匹配方式。
[ ]表示范围:
[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} 更精确限制了变量长度为1+{0,19}
A|B 可匹配A或B
^ 表示行的开头,^d表示必须以数字开头
$ 表示行的结束,d$表示必须以数字结束
re模块
注意:python中字符串也用 转义,python字符串前建议加 r
re.match(pattern, string, flags=0)
Try to apply the pattern at the start of the string, returning a match object, or None if no match was found.
In [312]: re.match('d{3}-d{3,8}','111-123') Out[312]: <_sre.SRE_Match object; span=(0, 7), match='111-123'> In [313]: re.match('d{3}-d{3,8}','111-123') Out[313]: <_sre.SRE_Match object; span=(0, 7), match='111-123'> #可见-和-都能匹配字符串中的- In [324]: re.match('100','100') Out[324]: <_sre.SRE_Match object; span=(0, 1), match='@'> In [325]: re.match('\100','100') Out[325]: <_sre.SRE_Match object; span=(0, 1), match='@'> In [326]: re.match('\100','100') #只能三个\ Out[326]: <_sre.SRE_Match object; span=(0, 1), match='@'>
切分字符串:
re.split(pattern, string, maxsplit=0, flags=0)
返回切分后列表
In [348]: re.split(r'[s\,]+','a,b c d') Out[348]: ['a', 'b', 'c', 'd']
分组:
提取子串,用()表示的就是要提取的分组(Group)。如^(d{3})-(d{3,8})$分别定义了两个组,可从匹配的字符串中提取区号和本地号码:
In [27]: import re In [28]: m = re.match(r'^(d{3})-(d{3,8})$','010-12345') In [29]: m Out[29]: <_sre.SRE_Match object; span=(0, 9), match='010-12345'> In [30]: m.group(0) #如果正则表达式中定义了组,可在match对象中用group()提取子串,参数无或0返回原始字符串,1、2、...表示第i个子串 Out[30]: '010-12345' #也可用groups()提取所有子串构成的元组 In [31]: m.group(1) Out[31]: '010' In [32]: m.group(2) Out[32]: '12345' In [33]: m.group(3) --------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-33-71a2c7935517> in <module>() ----> 1 m.group(3) IndexError: no such group
贪婪匹配:
正则匹配默认是贪婪匹配,即匹配尽可能多的字符
In [53]: re.match(r'^(d+)(0*)$','102300').groups() Out[53]: ('102300', '') In [54]: re.match(r'^(d+?)(0*)$','102300').groups() Out[54]: ('1023', '00')