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',)