请考虑以下正则表达式:
/xyz^abc/
/xyz$abc/
Run Code Online (Sandbox Code Playgroud)
这些会匹配什么?
我知道
^当在正则表达式的开头使用时,caret()匹配行的开头$),当在正则表达式的末尾使用时,匹配行的结尾^),当用作字符类的第一个字符时,否定该类我相信给定的正则表达式永远不会匹配,但我不确定.
根据选项的不同,正则表达式中的a ^或a 会导致匹配:$
>>> if re.search(r'xyz.^abc', "xyz\nabc", re.MULTILINE | re.DOTALL):
... print "Matched"
...
Matched
Run Code Online (Sandbox Code Playgroud)
MULTILINE使得^匹配行的开始,即使该行是不是在字符串的开头. DOTALL制作.匹配换行符.
(我找不到让你的确切例子与之匹配的方法.)
那些不会匹配任何东西。然而:
/(xyz$|^xyz)/
Run Code Online (Sandbox Code Playgroud)
这将匹配以 xyz 开头或结尾的任何行。
更新:
Andy G 指出多行模式可能会为您的正则表达式字符串找到匹配项。但这仅适用于将实现配置为支持字符串中锚匹配的情况。
这是来自Regular-Expressions.info(我最喜欢的学习和理解正则表达式的地方):
如果您有一个由多行组成的字符串,例如第一行\n第二行(其中 \n 表示换行符),通常需要使用行而不是整个字符串。因此,本教程中讨论的所有正则表达式引擎都可以选择扩展两个锚点的含义。然后 ^ 可以在字符串的开头(在上述字符串中的 f 之前)以及每个换行符之后(在 \n 和 s 之间)进行匹配。同样,$ 仍将匹配字符串的末尾(最后一个 e 之后),以及每个换行符之前(e 和 \n 之间)。
在 EditPad Pro 或 GNU Emacs 等文本编辑器和 PowerGREP 等正则表达式工具中,插入符号和美元总是在每行的开头和结尾匹配。这是有道理的,因为这些应用程序旨在处理整个文件,而不是短字符串。
在本网站上讨论的所有编程语言和库中,除 Ruby 外,您必须明确激活此扩展功能。它传统上被称为“多线模式”。在 Perl 中,您可以通过在正则表达式代码后添加一个 m 来完成此操作,如下所示:m/^regex$/m;。在 .NET 中,当您指定 RegexOptions.Multiline 时,锚点在换行前后匹配,例如在 Regex.Match("string", "regex", RegexOptions.Multiline) 中。