我无法匹配模式,“只要短语被多行分解,就无法运行此程序,例如:
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格式。
答案 0 :(得分:4)
s
和m
对您没有帮助。它们分别只改变.
和锚点的行为。锚点和边界也无济于事,因为它们只断言某些东西处于特定位置。
所有这些方法的问题在于换行符会在字符串(\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)