正则表达式是处理字符串的强大的工具,拥有独立的语法和独特的处理引擎
我们在大文本中匹配字符串时,使用str自带的函数(find)就可以完成,对于一些复杂的情况,像找出一些像邮箱、电话等任务时,我们就要自己定义一些规则来进行匹配,那么就需要使用正则表达式。
语法
语法 | 说明 | 表达式 | 完整匹配的字符串 |
---|---|---|---|
一般字符 | 匹配自身 | abc | abc |
. | 匹配任意除换行符”\n” | ||
[...] | 字符集,对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]。第一个字符如果是^则表示却反,如[^abc]表示不是abc的其他字符。所有的特殊字符在字符集中失去原有的特殊含义。在字符集中如果要使用]、-或^,可以在前面加上反斜杠 | a[bcd]e | abe ace ade |
\d | 数字:[0-9] | a\dc | a1c |
\D | 非数字:[^\d] | a\Dc | abc |
\s | 空白字符:[<空格>\t\r\n\f\v] | a\sc | a c |
\S | 非空白字符:[^\s] | a\Sc | abc |
\w | 单词字符:[A-Za-z0-9] | a\wc | abc |
\W | 非单词字符:[^\w] | a\Wc | a c |
* | 匹配前一个字符0或无限次 | abc | ab abccc |
+ | 匹配前一个字符1次或无限次 | abc+ | abc abccc |
? | 匹配前一个字符0次或1次 | abc? | ab abc |
{m} | 匹配前一个字符m次 | ab{2}c | abbc |
{m,n} | 匹配前一个字符m至n次。m和n可以省略:若省略m,则匹配0至n次;若省略n,ze匹配m致无限次 | ab{1,2}c | abc abbc |
^ | 匹配字符串开头在多行模式中匹配每一行的开头 | ^abc | abc |
$ | 匹配字符串末尾在多行模式中匹配每一行的末尾 | abc$ | abc |
\A | 仅匹配字符串开头 | \Aabc | abc |
\Z | 仅匹配字符串结尾 | abc\Z | abc |
\b | 匹配\w和\W之间 | a\b!bc | A!bc |
\B | [^\b] | a\Bbc | abc |
| | |代表左右表达式任意匹配一个。它总是先尝试匹配左边的表达式,一旦成功则跳过匹配右边的表达式 如果 | 没有被包含在()中,则它的范围是整个正则表达式 | abc |
(...) | 被括起来的表达式作为分组,从表达式左边开始每遇到一个分组的左括号’(’,编号+1.另外,分组表达式作为一个整体,可以后接数量词。表达式中的 | 仅在该组中有效 | (abc){2} a(123 |
(?P...) | 分组,除了原有的编号外再指定一个额外的别名 | (?Pabc){2} | abcabc |
<number> | 引用编号为的分组分配到的字符串 | (\d)abc\1 | 1abc15abc5 |
(?P=name) | 引用别名为的分组分配到的字符串 | (?P\d)abc(?P=id) | 1abc15abc5 |
(?...) | (…)的不分组版本,用于使用或后接数量词 | (?:abc){2} | abcabc |
(?iLmsux) | iLmsux的每个字符代表一个匹配模式,只能用在正则表达式的开头,可接多个 | (?i)abc | Abc |
(?#...) | #后的内容作为注释被忽略 | abc(?#comment)123 | abc123 |
(?!...) | 之后的字符串内容不需要匹配表达式才能成功匹配 | a(?!\d) | 后面不是数字的a |
(?=...) | 之后的字符串内容需要匹配表达式才能成功匹配 | a(?=\d) | 后面是数字的a |
(?<=...) | 之前的字符串内容需要匹配表达式才能成功匹配 | (?<=\d)a | 前面是数字的a |
(?<!...) | 之前的字符串内容不需要匹配表达式才能成功匹配 | (?<!\d)a | 前面不是数字的a |
(?(id/name)yes-pattern|no-pattern) | 如果编号为id别名为name的组匹配到字符,则需要匹配yes-pattern,否则需要匹配no-pattern | (\d)abc(?(1)\d|abc) | 1abc2 abcabc |
Python用法案例
re模块
Python通过re模块提供对正则表达式的支持使用re的步骤
- 将正则表达式的字符串形式编译为Pattern实例
- 使用Pattern实例处理文本并获取得匹配结果(一个Match实例)
- 使用Match实例获取信息,进行其他操作
import re# 将正则表达式的字符串形式编译成Pattern实例pattern = re.compile(r'hello.*\!')# 使用Pattern匹配文本,获取匹配结果,无法匹配返回nonematch = pattern.match('hello,xiaowuwan!how are you?')if match: # 使用Match获得分组信息 print(match.group())复制代码