re 正则表达式模块
一, 概述
就其本质而言, 正则表达式 (或 RE) 是一种小型的, 高度专业化的编程语言, 要讲他的具体用法要讲一本书! 它内嵌在 Python 中, 并通过 re 模块实现. 你可以为想要匹配的相应字符串集指定规则; 该字符串集可能包含英文语句, e-mail 地址, TeX 命令或任何你想搞定的东西. 然后你可以问诸如 "这个字符串匹配该模式吗?" 或 "在这个字符串中是否有部分匹配该模式呢?". 你也可以使用 RE 以各种方式来修改或分割字符串. 今天就来讲讲 re 模块的最常用的用法.
二, 常用的正在表达式符号
'.' 默认匹配除 \ n 之外的任意一个字符, 若指定 flag DOTALL, 则匹配任意字符, 包括换行
'^' 匹配字符开头, 若指定 flags MULTILINE, 这种也可以匹配上 (r"^a","\nabc\neee",flags=re.MULTILINE)
'
三, 常用的匹配方法
1,re.match(pattern, string, flags=0)
说明: 在 string 的开始处匹配模式
2,re.search(pattern, string, flags=0)
说明: 在 string 中寻找模式
3,re.findall(pattern, string, flags=0)
说明: 把匹配到的字符以列表的形式返回
4,re.split(pattern, string, maxsplit=0, flags=0)
说明: 匹配到的字符被当做列表分割符
5,re.sub(pattern, repl, string, count=0, flags=0)
说明: 匹配字符并替换
四, 常用方法
1,group([group1, ...])
说明: 获得一个或多个分组截获的字符串; 指定多个参数时将以元组形式返回. group1 可以使用编号也可以使用别名; 编号 0 代表整个匹配的子串; 不填写参数时, 返回 group(0); 没有截获字符串的组返回 None; 截获了多次的组返回最后一次截获的子串.
2,groups(default=None)
说明: 以元组形式返回全部分组截获的字符串. 相当于调用 group(1,2,...last).default 表示没有截获字符串的组以这个值替代, 默认为 None. 这个要跟分组匹配结合起来使用'(...)'
3,groupdict(default=None)
说明: 返回以有别名的组的别名为键, 以该组截获的子串为值的字典, 没有别名的组不包含在内. default 含义同上. 这个是跟另外一个分组匹配结合起来用的:
4,span([group])
说明: 返回 (start(group), end(group))
5,start([group])
说明: 返回指定的组截获的子串在 string 中的起始索引(子串第一个字符的索引),group 默认值为 0.
6,end([group])
说明: 返回指定的组截获的子串在 string 中的结束索引(子串最后一个字符的索引 + 1),group 默认值为 0.
7,compile(pattern[, flags])
说明: 根据包含正则表达式的字符串创建模式对象
五, 反斜杠的困扰
与大多数编程语言相同, 正则表达式里使用 "\" 作为转义字符, 这就可能造成反斜杠困扰. 假如你需要匹配文本中的字符 "\", 那么使用编程语言表示的正则表达式里将需要 4 个反斜杠 "\\\\": 前两个和后两个分别用于在编程语言里转义成反斜杠, 转换成两个反斜杠后再在正则表达式里转义成一个反斜杠. Python 里的原生字符串很好地解决了这个问题, 这个例子中的正则表达式可以使用 r"\\" 表示. 同样, 匹配一个数字的 "\\d" 可以写成 r"\d". 有了原生字符串, 你再也不用担心是不是漏写了反斜杠, 写出来的表达式也更直观.
六, 其他匹配模式
1,re.I(re.IGNORECASE)
说明: 忽略大小写 (括号内是完整的写法, 下同)
1
2
3
4
>>> import re
>>> a = re.search('addr',"inet Addr:10.161.146.134",flags=re.I)
>>> a.group()
'Addr' #忽略大小写
2,re.M(MULTILINE)
说明: 多行模式, 改变'^'和'$'的行为, 详细请见第 2 点
1
2
3
4
>>> import re
>>> a = re.search('^a',"inet\naddr:10.161.146.134",flags=re.M)
>>> a.group()
'a'
3,re.S(DOTALL)
说明: 点任意匹配模式, 改变'.'的行为
1
2
3
4
>>> import re
>>> a = re.search('.+',"inet\naddr:10.161.146.134",flags=re.S)
>>> a.group()
'inet\naddr:10.161.146.134'
注意: 上面这三种匹配模式, 知道就行.
七, 总结
1, 用 r''的方式表示的字符串叫做 raw 字符串, 用于抑制转义.
2, 正则表达式使用反斜杆 (\) 来转义特殊字符, 使其可以匹配字符本身, 而不是指定其他特殊的含义.
3, 这可能会和 python 字面意义上的字符串转义相冲突, 这也许有些令人费解, 比如, 要匹配一个反斜杆本身, 你也许要用'\\\\'来做为正则表达式的字符串, 而字符串里, 每个反斜杆都要写成 \\.
4, 你也可以在字符串前加上 r 这个前缀来避免部分疑惑, 因为 r 开头的 python 字符串是 raw 字符串, 所以里面的所有字符都不会被转义, 比如 r'\n'这个字符串就是一个反斜杆加上一字母 n, 而'\n'我们知道这是个换行符. 因此, 上面的'\\\\'你也可以写成 r'\\', 这样, 应该就好理解很多了.
匹配字符结尾, 或 e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group() 也可以
'*' 匹配 * 号前的字符 0 次或多次, re.findall("ab*","cabb3abcbbac") 结果为 ['abb', 'ab', 'a']
'+' 匹配前一个字符 1 次或多次, re.findall("ab+","ab+cd+abb+bba") 结果 ['ab', 'abb']
'?' 匹配前一个字符 1 次或 0 次
'{m}' 匹配前一个字符 m 次
'{n,m}' 匹配前一个字符 n 到 m 次, re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
'|' 匹配 | 左或 | 右的字符, re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
'(...)' 分组匹配 re.search("(?P<province>\d{4})(?P<city>\d{2})(?P<birthday>\d{4})","320922199306143242").groupdict()
结果:{'province': '3209', 'city': '22', 'birthday': '1993'}
'\' 转义
[a-z] 匹配 [a-z]
[A-Z] 匹配 [A-Z]
[0-9] 匹配数字 0-9
'\A' 只从字符开头匹配, re.search("\Aabc","alexabc") 是匹配不到的
'\Z' 匹配字符结尾, 同 $
'\d' 匹配数字 0-9
'\D' 匹配非数字
'\w' 匹配 [A-Za-z0-9]
'\W' 匹配非 [A-Za-z0-9]
's' 匹配空白字符,\t,\n,\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
三, 常用的匹配方法
1,re.match(pattern, string, flags=0)
说明: 在 string 的开始处匹配模式
2,re.search(pattern, string, flags=0)
说明: 在 string 中寻找模式
3,re.findall(pattern, string, flags=0)
说明: 把匹配到的字符以列表的形式返回
4,re.split(pattern, string, maxsplit=0, flags=0)
说明: 匹配到的字符被当做列表分割符
5,re.sub(pattern, repl, string, count=0, flags=0)
说明: 匹配字符并替换
四, 常用方法
1,group([group1, ...]) 说明: 获得一个或多个分组截获的字符串; 指定多个参数时将以元组形式返回. group1 可以使用编号也可以使用别名; 编号 0 代表整个匹配的子串; 不填写参数时, 返回 group(0); 没有截获字符串的组返回 None; 截获了多次的组返回最后一次截获的子串.
2,groups(default=None)
说明: 以元组形式返回全部分组截获的字符串. 相当于调用 group(1,2,...last).default 表示没有截获字符串的组以这个值替代, 默认为 None. 这个要跟分组匹配结合起来使用'(...)'
3,groupdict(default=None)
说明: 返回以有别名的组的别名为键, 以该组截获的子串为值的字典, 没有别名的组不包含在内. default 含义同上. 这个是跟另外一个分组匹配结合起来用的:
4,span([group])
说明: 返回 (start(group), end(group))
5,start([group])
说明: 返回指定的组截获的子串在 string 中的起始索引(子串第一个字符的索引),group 默认值为 0.
6,end([group])
说明: 返回指定的组截获的子串在 string 中的结束索引(子串最后一个字符的索引 + 1),group 默认值为 0.
7,compile(pattern[, flags])
说明: 根据包含正则表达式的字符串创建模式对象
五, 反斜杠的困扰
与大多数编程语言相同, 正则表达式里使用 "\" 作为转义字符, 这就可能造成反斜杠困扰. 假如你需要匹配文本中的字符 "\", 那么使用编程语言表示的正则表达式里将需要 4 个反斜杠 "\\\\": 前两个和后两个分别用于在编程语言里转义成反斜杠, 转换成两个反斜杠后再在正则表达式里转义成一个反斜杠. Python 里的原生字符串很好地解决了这个问题, 这个例子中的正则表达式可以使用 r"\\" 表示. 同样, 匹配一个数字的 "\\d" 可以写成 r"\d". 有了原生字符串, 你再也不用担心是不是漏写了反斜杠, 写出来的表达式也更直观.
六, 其他匹配模式
1,re.I(re.IGNORECASE)
说明: 忽略大小写 (括号内是完整的写法, 下同)
>>> import re
>>> a = re.search('addr',"inet Addr:10.161.146.134",flags=re.I)
>>> a.group()
'Addr' #忽略大小写
2,re.M(MULTILINE)
说明: 多行模式, 改变'^'和'$'的行为, 详细请见第 2 点
>>> import re
>>> a = re.search('^a',"inet\naddr:10.161.146.134",flags=re.M)
>>> a.group()
'a'
3,re.S(DOTALL)
说明: 点任意匹配模式, 改变'.'的行为
>>> import re
>>> a = re.search('.+',"inet\naddr:10.161.146.134",flags=re.S)
>>> a.group()
'inet\naddr:10.161.146.134'
注意: 上面这三种匹配模式, 知道就行.
七, 总结
1, 用 r''的方式表示的字符串叫做 raw 字符串, 用于抑制转义.
2, 正则表达式使用反斜杆 (\) 来转义特殊字符, 使其可以匹配字符本身, 而不是指定其他特殊的含义.
3, 这可能会和 python 字面意义上的字符串转义相冲突, 这也许有些令人费解, 比如, 要匹配一个反斜杆本身, 你也许要用'\\\\'来做为正则表达式的字符串, 而字符串里, 每个反斜杆都要写成 \\.
4, 你也可以在字符串前加上 r 这个前缀来避免部分疑惑, 因为 r 开头的 python 字符串是 raw 字符串, 所以里面的所有字符都不会被转义, 比如 r'\n'这个字符串就是一个反斜杆加上一字母 n, 而'\n'我们知道这是个换行符. 因此, 上面的'\\\\'你也可以写成 r'\\', 这样, 应该就好理解很多了.
来源: https://www.cnblogs.com/ManyQian/p/8410826.html