正则表达式对于初学者来说,要用好这个功能还是有点难度,也看了好久书加练习才掌握一些基础。对学到的一些东西还是写下来比较好一些,免得过几天又忘了。
常用符号:. * ? ()
常用方法: findall search sub
常用技巧
1 Python 正则式的基本用法
Python 通过标准库re模块支持正则表达式。
>>> import re
>>> string = "XXXIXXXLoveXXX"
>>> re.findall('XXX(.*?)XXX', string)
['I']
>>>
在python术语中,有两种主要方法完成模式匹配:serarching 和matching.
搜索:在字符串中任意部分中搜索匹配模式。
匹配:判断一个字符串是否能从起始位置全部或部分匹配某个模式。
常用正则符号字符如下图:
a. 基本规则
'.' 匹配所有字符
匹配除换行符 '\n' 外的所有字符。如果使用了 'S' 选项,匹配包括 '\n' 的所有字符。要明确的匹配一个'.',必须使用’\‘对它进行转义。
>>> s = """XXX
IXXX"""
>>> re.findall('.+', s)
['XXX', 'IXXX']
>>> re.findall('.+', s, re.S)
['XXX\nIXXX']
>>>
b. 对基本规则作限定(闭包操作符)
'*' 0 或多次匹配。常用.*(贪心算法)
>>> x = "abc2323sf23"
>>> re.findall('c.*s', x)
['c2323s']
>>>
'+' 1 次或多次匹配
>>> x = "abc2323sf23"
>>> re.findall('c\d+s', x)
['c2323s']
>>>
'?' 0 或 1 次匹配。常用.*?(非谈心算法)
>>> x = "abc2323sf23"
>>> re.findall('c\d?', x)
['c2']
>>> re.findall('c\d+?', x)
['c2']
>>> re.findall('c.*?', x)
['c']
‘{m}'精确匹配 m 次
‘{m,n}'匹配最少 m 次,最多 n 次
2. ()创建组
一对()和正则表达式一起使用可达到:
a. 对正则进行分组
b. 匹配子组
>>> s= 'XXXIXXXLOVEXXXYOU'
>>> re.findall('XXX(.*)XXX(.*)XXX(.*)', s)
[('I', 'LOVE', 'YOU')]
>>>
可以看到 findall 函数只返回了包含在 ’()’ 中的内容,而虽然前面和后面的内容都匹配成功了,却并不包含在结果中。
3. 常用函数
findall(pattern, string[,flags])
在目标字符串中查找符合规则的字符串。
第一个参数是规则,第二个参数是目标字符串,后面还可以跟一个规则选项。
返回结果结果是一个列表, 中间存放的是符合规则的字符串。如果没有符合规则的字符串被找到,就返回一个空列表。
常用规则选项
I IGNORECASE 忽略大小写区别。
L LOCAL 字符集本地化。这个功能是为了支持多语言版本的字符集使用环境的,比如在转义符/w ,在英文环境下,它代表[a-zA-Z0-9] ,即所以英文字符和数字。如果在一个法语环境下使用,缺省设置下,不能匹配 "é" 或 "ç" 。 加上这 L 选项和就可以匹配了。不过这个对于中文环境似乎没有什么用,它仍然不能匹配中文字符。
M MULTILINE 多行匹配。在这个模式下 ’^’( 代表字符串开头 ) 和 ’$’( 代表字符串结尾 ) 将能够匹配多行的情况,成为行首和行尾标记。
当我们调用findall()方法,我们可以非常简单的得到一个所有匹配模式的 列表,而不是得到对象。
>>> string = 'bird cat bird, cat dog'
>>> s = re.findall(r'cat', string)
>>> s
['cat', 'cat']
>>>
match 与 search
match( pattern, string, flags = 0)
search( pattern, string, flags = 0)
match函数尝试从字符串的开头开始对模式进行匹配,如果匹配成功,就返回一个匹配对象,如果失败返回空,匹配对象的group()方法可以用来显示那个成功的匹配。
search函数工作方式和match一样,这两个函数唯一的区别是: match 从字符串的开头开始匹配,如果开头位置没有匹配成功,就算失败了;而 search 会跳过开头,继续向后寻找是否有匹配的字符串。
常见例子:
对字符串'bird cat bird'调用mathch()方法,查找模式'bird'将会匹配:
>>> re.match(r'bird', 'cat bird cat')
>>> string = 'bird cat bird'
>>> s = re.match(r'bird', string)
>>> s
<_sre.SRE_Match object at 0x0000000003104D30>
>>> s.group()
'bird'
>>> s = re.match(r'cat', string)
>>> s
>>>
但是,如果我们对同一个字符串调用math()方法,查找模式'cat',则不会找到匹配。
而search()结果则不一样,search()方法会在它查找到一个匹配项之后停止继续查找,并返回其首次出现的位置。