PCRE正则表达式多行匹配需要帮助

时间:2013-04-19 18:13:40

标签: regex pcre multiline

我无法匹配模式,“只要短语被多行分解,就无法运行此程序,例如:

This program cannot be run

T
his program cannot be run

Thi
s program cannot be run

.
.

This pr
ogram cannot be run

图案可以在任何点分成两行。我尝试过使用/ m和/ s以及锚点和边界,但我无法使用它。我不知道自己做错了什么。我甚至尝试在每个角色之后使用\ s甚至不匹配!该模式必须是PCRE格式。

3 个答案:

答案 0 :(得分:4)

sm对您没有帮助。它们分别只改变.和锚点的行为。锚点和边界也无济于事,因为它们只断言某些东西处于特定位置。

所有这些方法的问题在于换行符会在字符串(\n\r\r\n中引入一个或两个新字符,具体取决于您的系统)。因此,如果您需要仅使用正则表达式的解决方案,则必须在任何可能的位置允许换行:

/T[\r\n]*h[\r\n]*i[\r\n]*s[\r\n]* [\r\n]*p[\r\n]*.../

等等。

如果您可以修改输入,则首先通过替换

来删除换行符会更容易
/[\r\n]+/

使用空字符串然后运行您已经拥有的模式。

答案 1 :(得分:2)

如果换行字符可以出现在搜索子字符串中的任何位置,则需要添加相应的字符以匹配正则表达式中的换行符。

假设换行符始终为\n

T\n?h\n?i\n?s\n? \n?p\n?r\n?o\n?g\n?r\n?a\n?m\n? \n?c\n?a\n?n\n?n\n?o\n?t\n? \n?b\n?e\n? \n?r\n?u\n?n

答案 2 :(得分:0)

所以它看起来很糟糕,也许有人可以提供更好的解决方案,这里是使用re.S标志在python中

>>> a = """
... This pr
... ogram cannot be run"""
>>> re.search("T[\n]*h[\n]*i[\n]*s[\n]* [\n]*p[\n]*r[\n]*o[\n]*",a,re.S)
<_sre.SRE_Match object at 0x7f9d746e9e68>

如果字符串发生变化,那么制作正则表达式的简便方法

>>> a = "This program cannot be run"
>>> b = list(a)
>>> r = '[\r\n]*'.join(b)