所以,我一直在做一些正则表达式,当我使用((.|\s)*)
来捕获多行文本时,似乎正则表达式库正在捕获一个额外的新行。[\S\s]*
由于某种原因而工作:
如果您在下面看到,第一个正则表达式会生成一个额外的\n
组,为什么?:
>>> s = """
... #pragma whatever
... #pr
... asdfsadf
... #pragma START-SomeThing-USERCODE
... this is the code
... this is more
... #pragma END-SomeThing-USERCODE
... asd
... asdf
... sadf
... sdaf
... """
>>> r = r"(#pragma START-(.*)-USERCODE\s*\n)((.|\s)*)(#pragma END-(.*)-USERCODE)"
>>> re.findall(r, s) [('#pragma START-SomeThing-USERCODE\n', 'SomeThing', 'this is the code\nthis is more\n', '\n', '#pragma END-SomeThing-USERCODE', 'SomeThing')]
>>> r = r"(#pragma START-(.*)-USERCODE\s*\n)([\S\s]*)(#pragma END-(.*)-USERCODE)"
>>> re.findall(r, s) [('#pragma START-SomeThing-USERCODE\n', 'SomeThing', 'this is the code\nthis is more\n', '#pragma END-SomeThing-USERCODE', 'SomeThing')]
答案 0 :(得分:3)
subregex
((.|\s)*)
匹配"this is the code\nthis is more\n"
。外括号捕获整个字符串。
内括号一次捕获一个字符(除换行符之外的任何字符,或空格(包括换行符))。由于重复该组,因此每次重复都会覆盖该组的内容。在匹配结束时,匹配的最后一个字符(\n
)将保留在该组中。
所以,如果你想避免这种情况,要么让内部组不能捕获:
((?:.|\s)*)
或使用([\s\S]*)
成语来匹配真正的任何角色。但是,使用([\s\S]*?)
可能是个好主意,以确保匹配最小可能的字符数。
答案 1 :(得分:-1)
此表达式生成嵌套组
((.|\s)*)
因为您使用嵌套大括号。对于单字符OR方括号是一个合适的选择;当您想要在两个单词之间进行选择时,此语法是合适的
(treat|trick)