Python 正则表达式基本语法

Python 正则表达式

  • 前言
  • 1. 正则表达式基本语法
    • 1.1 正则表达式 *pattern* 有两种:
    • 1.2 一些特殊的模式匹配字符
  • 参考

前言

Python中的正则表达式与Perl中具有许多相似的模式。
在Python正则表达式模式匹配中,有一个需要注意的事项是:

  • 反斜杠(\)的使用,
    1. 用于转义序列,如 \n ,表示两个字符”\“和”n“
    2. 用于特殊的含义,如 \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”
(?<=…) 后向肯定断言
注意:正则表达式(以…表示)必须有固定的长度,这意味着允许使用abca|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’)
m.group(0)
Out: ‘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.comuser@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

Published by

风君子

独自遨游何稽首 揭天掀地慰生平