动机
进一步了解python正则表达式的相关使用
目录
-
编译标志
-
更多元字符
编译标志
编译标志允许你修改正则表达式的工作方式。 标志在 re
模块中有两个名称,长名称如 IGNORECASE
和一个简短的单字母形式,例如 I
。 (如果你熟悉 Perl 的模式修饰符,则单字母形式使用和其相同的字母;例如, re.VERBOSE
的缩写形式为 re.X
。)多个标志可以 通过按位或运算来指定它们;例如,re.I | re.M
设置 I
和 M
标志。
这是一个可用标志表,以及每个标志的更详细说明。
标志 意义 ASCII
,A
使几个转义如 \w
、\b
、\s
和\d
匹配仅与具有相应特征属性的 ASCII 字符匹配。DOTALL
,S
使 .
匹配任何字符,包括换行符。IGNORECASE
,I
进行大小写不敏感匹配。 LOCALE
,L
进行区域设置感知匹配。 MULTILINE
,M
多行匹配,影响 ^
和$
。VERBOSE
,X
(为 '扩展')启用详细的正则,可以更清晰,更容易理解。
I
IGNORECASE
执行不区分大小写的匹配;字符类和字面字符串将通过忽略大小写来匹配字母。 例如,
[A-Z]
也匹配小写字母。 除非使用ASCII
标志来禁用非ASCII匹配,否则完全 Unicode 匹配也有效。 当 Unicode 模式[a-z]
或[A-Z]
与IGNORECASE
标志结合使用时,它们将匹配 52 个 ASCII 字母和 4 个额外的非 ASCII 字母:'İ' (U+0130,拉丁大写字母 I,带上面的点),'ı' (U+0131,拉丁文小写字母无点 i),'s' (U+017F,拉丁文小写字母长 s) 和'K' (U+212A,开尔文符号)。Spam
将匹配'Spam'
,'spam'
,'spAM'
或'ſpam'
(后者仅在 Unicode 模式下匹配)。 此小写不考虑当前区域设置;如果你还设置了LOCALE
标志,则将考虑。
L
LOCALE
使
\w
、\W
、\b
、\B
和大小写敏感匹配依赖于当前区域而不是 Unicode 数据库。区域设置是 C 库的一个功能,旨在帮助编写考虑到语言差异的程序。例如,如果你正在处理编码的法语文本,那么你希望能够编写
\w+
来匹配单词,但\w
只匹配字符类[A-Za-z]
字节模式;它不会匹配对应于é
或ç
的字节。如果你的系统配置正确并且选择了法语区域设置,某些C函数将告诉程序对应于é
的字节也应该被视为字母。在编译正则表达式时设置LOCALE
标志将导致生成的编译对象将这些C函数用于\w
;这比较慢,但也可以使\w+
匹配你所期望的法语单词。在 Python 3 中不鼓励使用此标志,因为语言环境机制非常不可靠,它一次只处理一个“文化”,它只适用于 8 位语言环境。默认情况下,Python 3 中已经为 Unicode(str)模式启用了 Unicode 匹配,并且它能够处理不同的区域/语言。
M
MULTILINE
(
^
和$
还没有解释;它们将在以下部分介绍 更多元字符。)通常
^
只匹配字符串的开头,而$
只匹配字符串的结尾,紧接在字符串末尾的换行符(如果有的话)之前。 当指定了这个标志时,^
匹配字符串的开头和字符串中每一行的开头,紧跟在每个换行符之后。 类似地,$
元字符匹配字符串的结尾和每行的结尾(紧接在每个换行符之前)。
S
DOTALL
使
'.'
特殊字符匹配任何字符,包括换行符;没有这个标志,'.'
将匹配任何字符 除了 换行符。
A
ASCII
使
\w
、\W
、\b
、\B
、\s
和\S
执行仅 ASCII 匹配而不是完整匹配 Unicode 匹配。 这仅对 Unicode 模式有意义,并且对于字节模式将被忽略。
X
VERBOSE
此标志允许你编写更易读的正则表达式,方法是为您提供更灵活的格式化方式。 指定此标志后,将忽略正则字符串中的空格,除非空格位于字符类中或前面带有未转义的反斜杠;这使你可以更清楚地组织和缩进正则。 此标志还允许你将注释放在正则中,引擎将忽略该注释;注释标记为
'#'
既不是在字符类中,也不是在未转义的反斜杠之前。例如,这里的正则使用
re.VERBOSE
;看看阅读有多容易?:
charref = re.compile(r"""
&[#] # Start of a numeric entity reference
(
0[0-7]+ # Octal form
| [0-9]+ # Decimal form
| x[0-9a-fA-F]+ # Hexadecimal form
)
; # Trailing semicolon
""", re.VERBOSE)
如果没有详细设置,正则将如下所示:
charref = re.compile("&#(0[0-7]+"
"|[0-9]+"
"|x[0-9a-fA-F]+);")
更多元字符
|
或者“or”运算符。 如果 A 和 B 是正则表达式,A|B
将匹配任何与 A 或 B 匹配的字符串。 |
具有非常低的优先级,以便在交替使用多字符字符串时使其合理地工作。 Crow|Servo
将匹配 'Crow'
或 'Servo'
,而不是 'Cro'
、'w'
或 'S'
和 'ervo'
。
要匹配字面 '|'
,请使用 \|
,或将其括在字符类中,如 [|]
。
^
在行的开头匹配。 除非设置了 MULTILINE
标志,否则只会在字符串的开头匹配。 在 MULTILINE
模式下,这也在字符串中的每个换行符后立即匹配。
例如,如果你希望仅在行的开头匹配单词 From
,则要使用的正则 ^From
。:
print(re.search('^From', 'From Here to Eternity'))
<re.Match object; span=(0, 4), match='From'>
print(re.search('^From', 'Reciting From Memory'))
None
要匹配字面 '^'
,使用 \^
。
$
匹配行的末尾,定义为字符串的结尾,或者后跟换行符的任何位置。:
>>> print(re.search('}$', '{block}'))
<re.Match object; span=(6, 7), match='}'>
>>> print(re.search('}$', '{block} '))
None
>>> print(re.search('}$', '{block}\n'))
<re.Match object; span=(6, 7), match='}'>
以匹配字面 '$'
,使用 \$
或者将其包裹在一个字符类中,例如 [$]
。
\A
仅匹配字符串的开头。 当不在 MULTILINE
模式时,\A
和 ^
实际上是相同的。 在 MULTILINE
模式中,它们是不同的: \A
仍然只在字符串的开头匹配,但 ^
可以匹配在换行符之后的字符串内的任何位置。
\Z
只匹配字符串尾。
\b
字边界。 这是一个零宽度断言,仅在单词的开头或结尾处匹配。 单词被定义为一个字母数字字符序列,因此单词的结尾由空格或非字母数字字符表示。
参考
https://docs.python.org/zh-cn/3/howto/regex.html#regex-howto