python 使用 re 模块来使用正则表达式对字符串进行匹配,常用的方法如下:
re.findall(pattern, string):搜索 string,以列表的形式返回全部能匹配的子串
In [2]: re.findall(r'o', 'hello world') Out[2]: ['o', 'o'] In [3]: re.findall(r'ab+', 'absfsdjabbcd') Out[3]: ['ab', 'abb']
re.S:表示可以用点(.)来匹配换行符,如下,不加 re.S 是不能匹配 的
In [4]: re.findall(r'.', 'a b c') Out[4]: ['a', 'b', 'c'] In [5]: re.findall(r'.', 'a b c', re.S) Out[5]: ['a', ' ', 'b', ' ', 'c']
re.match(pattern, string):搜索 string,只从开头的位置进行匹配,匹配成功返回一个对象,需要使用对象的 group() 方法来获取匹配到的内容;如果匹配不成功返回None
In [14]: m = re.match(r'he', 'hello world') In [15]: m.group() Out[15]: 'he'
In [16]: m = re.match(r'(w+)s(w+)', 'hello world') # 也可以采用分组的形式来匹配 # group(1)可以查看匹配到的第一个分组 In [24]: m.group(1) # group(2)可以查看匹配到的第二个分组 Out[24]: 'hello' # groups()可以查看匹配到的所有分组 In [25]: m.group(2) Out[25]: 'world' In [26]: m.groups() Out[26]: ('hello', 'world')
re.search(pattern, string):搜索 string,只匹配第一个符合规则的字符串,匹配成功则返回一个对象,需要使用对象的 group() 方法来获取匹配到的内容;未匹配成功返回None
In [42]: m = re.search(r'l', 'hello world') In [46]: m.group() Out[46]: 'l'
re.sub(pattern, repl, string, count=0):用于替换字符串,count=0 可以指定替换的次数,默认全部替换
In [48]: re.sub(r'l', 'L', 'hello world') Out[48]: 'heLLo worLd' In [49]: re.sub(r'l', 'L', 'hello world', count=2) Out[49]: 'heLLo world'
re.compile(pattern):用于将正则表达式编译成一个对象,然后再用这个对象去调用 findall() 等方法进行匹配,这样做可以提高匹配的效率
In [53]: pattern = re.compile(r'l+') In [54]: pattern.findall('hello world') Out[54]: ['ll', 'l']
re.I:用于指定在进行正则匹配时忽略大小写,如下,如果不加上 re.I 只会匹配小写字符
In [55]: re.findall(r'l', 'hello worLd') Out[55]: ['l', 'l'] In [56]: re.findall(r'l', 'hello worLd', re.I) Out[56]: ['l', 'l', 'L']
re.M:用于指定多行匹配,只影响 ^ 和 $,如下,如果我们不加 re.M ,默认只匹配第一行,加了 re.M 会匹配多行,通常用在对文件的匹配上
In [63]: re.findall(r'^a', 'aaa abc ack') Out[63]: ['a'] In [64]: re.findall(r'^a', 'aaa abc ack', re.M) Out[64]: ['a', 'a', 'a']
In [65]: with open('/etc/passwd') as fd: ....: data = fd.read() ....: In [66]: re.findall(r'^ftp', data) # 如果不加re.M,则表示只对第一行进行正则匹配 Out[66]: [] In [67]: re.findall(r'^ftp', data, re.M) # 如果加上re.M,则表示对每一行进行正则匹配 Out[67]: ['ftp']
re.X:如果使用该方法,那么正则表达式可以使用多行来写,如下,如果不使用 re.X,那么我们只能把正则表达式写在一行,加上 re.X 可以写成多行
In [68]: mail = '1210640219@qq.com' In [69]: re.findall(r'd{1,10}@w+.[a-z]{3}', mail) Out[69]: ['1210640219@qq.com'] In [72]: re.findall(r''' ....: d{1,10} ....: @ ....: w+ ....: . ....: [a-z]{3} ....: ''', mail, re.X) Out[72]: ['1210640219@qq.com']