6.1 正则表达式
- 在正则表达式中,如果直接给出字符,就是精确匹配。用\d可以匹配一个数字,\w可以匹配一个字母或数字,所以:
– ‘00\d’可以匹配’007’,但无法匹配’00A’;
– ‘\d\d\d’可以匹配’010’;
– ‘\w\w\d’可以匹配’py3’; - .可以匹配任意字符,所以: 'py.‘可以匹配’pyc’、‘pyo’、'py!'等等。
- 要匹配变长的字符,在正则表达式中,用*表示任意个字符(包括0个),用+表示至少一个字符,用?表示0个或1个字符,用{n}表示n个字符,用{n,m}表示n-m个字符:
- 例子:\d{3}\s+\d{3,8}
- 我们来从左到右解读一下:
– \d{3}表示匹配3个数字,例如’010’;
– \s可以匹配一个空格(也包括Tab等空白符),所以\s+表示至少有一个空格,例如匹配’ ‘,’ ‘等;
– \d{3,8}表示3-8个数字,例如’1234567’。 - 如果要匹配’010-12345’这样的号码呢?由于’-‘是特殊字符,在正则表达式中,要用’'转义,所以,上面的正则是\d{3}-\d{3,8}。
- 为了更精确地匹配,可以用[]表示范围,比如:
–[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’了。
6.2 re模块
• Python提供re模块,包含所有正则表达式的功能。由于Python的字符串本身也用\转义,所以要特别注意
• 使用Python的r前缀,就不用考虑转义的问题
• match()方法判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None。常见的判断方法就是:
6.3 实验
In:
import re
In:
re.findall('\d','123abc') #数字
out:
['1', '2', '3']
In:
re.findall('\w','123abc') #字符数字
out:
['1', '2', '3', 'a', 'b', 'c']
In:
re.findall('\s','1 23 ab c') #空格
out:
[' ', ' ', ' ']
In:
re.findall('\d\d\d','123abc') #数字
out:
['123']
In:
re.findall('\d+','123abc') #数字
out:
['123']
In:
re.findall('py.','py0') #数字
out:
['py0']
In:
re.findall('py.?','pyaa')
out:
['pya']
In:
re.findall('\d{3}','123abc') #数字
out:
['123']
In:
re.findall('[a-z]+','123abc')
out:
['abc']
In:
re.findall('[a-z0-9]+','123abc_')
out:
['123abc']
In:
re.findall('[a-zA-Z0-9]+','123abc_A')
out:
['123abc', 'A']
In:
re.findall('[a-zA-Z0-9_]+','123abc_A')
out:
['123abc_A']
In:
re.findall('[a-zA-Z0-9\-]+','123abc-A')
out:
['123abc-A']
In:
re.findall('^\d+','123abc-A') #以数字开头
out:
['123']
In:
re.findall('^\d+','abc123-A')
out:
[]
In:
re.findall('\d+$','abc123-A')
out:
[]
In:
re.findall('\d+$','abc123') #以数字结尾
out:
['123']
In:
re.findall('p|P\w+','Python') #
out:
['Python']
In:
re.findall('py(\w+)on',r'python') #小括号就是要匹配的内容
out:
['th']
In:
re.match('py(\w+)on',r'python').group(1) #小括号就是要匹配的内容
out:
'th'
6.3.1 编译
In:
py_rule = re.compile('py(\w+)on')
In:
py_rule.findall('python')
out:
['th']
In:
py_rule.findall('pyxxon')
out:
['xx']
In:
py_rule.match('pyxxon').groups()
out:
('xx',)