Python 正则表达式
- 前言
- 1. 正则表达式基本语法
-
- 1.1 正则表达式 *pattern* 有两种:
- 1.2 一些特殊的模式匹配字符
- 参考
前言
Python中的正则表达式与Perl中具有许多相似的模式。
在Python正则表达式模式匹配中,有一个需要注意的事项是:
- 反斜杠(\)的使用,
- 用于转义序列,如 \n ,表示两个字符”\“和”n“
- 用于特殊的含义,如 \n ,表示一个换行符
注意:为列解决上面的混淆,可以使用Python中原始字符转义语法,如 " r’\n’ ",表示与 \n 相同的含义。
正则表达式的来自于模块:import re
1. 正则表达式基本语法
1.1 正则表达式 pattern 有两种:
- 特殊字符,如 ”|“ 和 ”(“ 等,这些字符要么表示原始字符,要么表示特殊含义影响模式匹配
- 重复限定符,如 *, +, ?,{m,n} 等。
- 它们不能直接进行嵌套,例如:为了将第二次重复应用于内部重复,可以使用括号。
- 如__(?:a{6})*__,表示匹配多个6个a组成的字符。
1.2 一些特殊的模式匹配字符
字符 | 含义 |
---|---|
. | 匹配一个字符(除换行符以外的所有字符) |
^ | 仅匹配以特定字符串开头的模式 |
$ | 仅匹配以特定字符串结尾的模式 |
* | 匹配>=0个字符模式,贪婪匹配 |
+ | 匹配>=1个字符模式,贪婪匹配 |
? | 匹配0个或1个字符模式,贪婪匹配 |
*? +? ?? |
在上述贪婪匹配限定符后添加 ?,表示一种非贪婪匹配 |
{m} | 指定重复的次数。a{6} 表示匹配6个 a |
{m,n} | 表示匹配范围 a{3,5}:表示匹配3到5个 a a{4,}b:表示至少4个 a ; a{,5}b:表示至多5个 a |
{m,n}? | 非贪婪匹配,匹配最少的模式 匹配 ‘aaaaaa’ 的模式: a{3,5} 将返回5个 a a{3,5}? 将返回3个 a |
\ | 1. 转义字符 2. 特殊字符 注:建议除最简单的转义序列外,使用原始字符序列 ‘r’,如 'r\n’ |
[] | 1. 匹配其中的一个,如 [amk] 2. 可以指定一个范围,如 [a-z], [0-5][0-9] 3. 特殊限定符在 [] 中,将失去其特殊意义。如 [(+*)] ,将匹配其中的任意一个字符( ‘(’, ‘+’, ‘*’, ‘)’) 4. 字符类依然表示其具体的范围。如 ‘[\w]’ 匹配任意字符中的一个 5. ^ 表示除指定字符外的任意一个字符。如 ‘[^5]’ 表示除 ‘5’ 以外的任意一个字符 |
| | 表示或,如 A|B 表示要么匹配 A , 要么匹配 B |
(…) | 1. 匹配括号内正则表达式,并将所有匹配的内容进行分组标号(0,1,2 …) 2. 可以在执行匹配后检索子组的内容,并且以后可以在字符串中使用 \number 访问匹配的子组内容。如 re.compile(r’\b(\w+)\s+\1\b’) |
(?..) | (? 开头的为正则表达式的扩展语法(如下所示) |
(?:…) | 非捕获组,即该子组匹配的字符串无法从后边获取 |
(?P<name>…) | 命名子组,通过组的名字(name)即可访问到子组匹配的字符串。其在以下三种情况下被调用 比如,正则表达式为 p = re.compile(’(?P[’"]).*?(?P=quote)’) 1. 用于正则表达式自身:(?:P=quote) 和 \1 2. 用于match对象中:m.group(‘quote’) ,m.end(‘quote’) 3. 用于re.sub()函数的 repl 参数。形式如:\g<quote> , \g<1> 和 \1 |
(?P=name) | 后向引用已命名的匹配的子组 |
(?#…) | 在模式匹配过程中,被忽略(不匹配)的内容 |
(?=…) | 前向肯定断言 如果当前包含的正则表达式(这里以 … 表示)在当前位置成功匹配,则代表成功,否则失败。 一旦该部分正则表达式被匹配引擎尝试过,就不会继续进行匹配了;剩下的模式在此断言开始的地方继续尝试。 如:Isaac (?=Asimov) 仅当匹配 “Asimov” 时,匹配字符串 “lsaac” |
(?!..) | 前向否定断言 与前向肯定断言相反(不匹配则表示成功,匹配表示失败) 如:Isaac (?!Asimov) 表示仅当不匹配 “Asimov” 时,匹配字符串 “lsaac” |
(?<=…) | 后向肯定断言 注意:正则表达式(以…表示)必须有固定的长度,这意味着允许使用abc或 a|b,但不允许使用a*和a {3,4} 使用 search() 函数而不是 match() 函数,以遍历所有可能的匹配项 import re m = re.search(’(?<=abc)def’, ‘dfadabcdefjllkjl’) m.group(0) Out: ‘def’ m = re.search(r’(?<=-)\w+’, ‘spam-egg’) |
(?<!..) | 后向否定断言 |
(?(id/name)yes-pattern|no-pattern) | 1. 如果子组的序号或名字存在的话,则尝试 yes-pattern 匹配模式;否则尝试 no-pattern 匹配模式 2. no-pattern 是可选的 如:(<)?(\w+@\w+(?:.\w+)+)(?(1)>|$) 是一个匹配邮件格式的正则表达式,可以匹配 <user@host.com> 和 user@fishc.com,但是不会匹配 <user@fishc.com 或 user@fishc.com> |
\number | 匹配子组,序号从 1 开始 |
\A | 匹配输入字符串的开始位置(一句话的开始) |
\Z | 匹配输入字符串的结束位置(一句话的结尾) |
\b | 匹配单词的边界,以一个字符开始或结束的单词 |
\B | 匹配单词的边界,不以一个字符开始或结束的单词 |
\d | 匹配 [0-9] 数字中的一个数字 |
\D | 匹配 [^0-9] (除0-9以外)的任意一个字符 |
\s | 匹配 空白 字符,包括 [ \t\n\r\f\v] 中的任意一个(空格,换行符,制表符…)字符 |
\S | 匹配 非空白 字符,包括 [^ \t\n\r\f\v] (除空格,换行符,制表符…以外 )的任意一个字符 |
\w | 匹配 [a-zA-Z0-9_] 中任意一个字符 |
\W | 匹配 [^a-zA-Z0-9_] (除 a-zA-Z0-9_ 以外)中任意一个字符 |
参考
https://docs.python.org/3.8/library/re.html#module-re