Python 匹配一个';s在多条线上任意分割

Python 匹配一个';s在多条线上任意分割,python,regex,multiline,Python,Regex,Multiline,正则表达式中有没有一种方法可以匹配任意拆分为多行的字符串?比如说,我们在一个文件中有以下格式: msgid "This is " "an example string" msgstr "..." msgid "This is an example string" msgstr "..." msgid "" "This is an " "example" " string" msgstr "..." msgid "This is " "an unmatching string" ms

正则表达式中有没有一种方法可以匹配任意拆分为多行的字符串?比如说,我们在一个文件中有以下格式:

msgid "This is "
"an example string"
msgstr "..."

msgid "This is an example string"
msgstr "..."

msgid ""
"This is an " 
"example" 
" string"
msgstr "..."

msgid "This is " 
"an unmatching string" 
msgstr "..."
因此,我们希望有一个模式能够匹配所有示例字符串,即:匹配字符串,不管它如何跨行拆分。请注意,我们关注的是示例中所示的特定字符串,而不仅仅是任何字符串。因此,在本例中,我们希望匹配字符串
“这是一个示例字符串”


当然,我们可以很容易地对字符串进行压缩,然后应用匹配,但我想知道这是否可行。我说的是Python,但是一般的答案是可以的。

你想匹配一系列单词吗?如果是这样,您可以查找中间只有空格(\s)的单词,因为\s匹配换行符和空格

import re

search_for = "This is an example string"
search_for_re = r"\b" + r"\s+".join(search_for.split()) + r"\b"
pattern = re.compile(search_for_re)
match = lambda s: pattern.match(s) is not None

s = "This is an example string"
print match(s), ":", repr(s)

s = "This is an \n example string"
print match(s), ":", repr(s)

s = "This is \n an unmatching string"
print match(s), ":", repr(s)
印刷品:

True : 'This is an example string'
True : 'This is an \n example string'
False : 'This is \n an unmatching string'

这有点棘手,因为每一行都需要引号,并且允许空行。下面是一个与您正确发布的文件匹配的正则表达式:

'(""\n)*"This(( "\n(""\n)*")|("\n(""\n)*" )| )is(( "\n(""\n)*")|("\n(""\n)*" )| )an(( "\n(""\n)*")|("\n(""\n)*" )| )example(( "\n(""\n)*")|("\n(""\n)*" )| )string"'
这有点令人困惑,但它只是您想要匹配的字符串,但它以以下开头:

(""\n)*"
并将每个单词之间的空格替换为:

(( "\n(""\n)*")|("\n(""\n)*" )| )
它在每个单词后面检查三种不同的可能性,要么是“空格,引号,换行符,(不限数量的空字符串)引号”,要么是相同的序列,但更多的是结尾的空格,或者只是一个空格

一种更简单的方法是编写一个小函数,该函数将接受您试图匹配的字符串,并返回将匹配它的正则表达式:

def getregex(string):
    return '(""\n)*"' + string.replace(" ", '(( "\n(""\n)*")|("\n(""\n)*" )| )') + '"'
因此,如果您将发布的文件放在一个名为“filestring”的字符串中,您将得到如下匹配:

import re

def getregex(string):
    return '(""\n)*"' + string.replace(" ", '(( "\n(""\n)*")|("\n(""\n)*" )| )') + '"'

matcher = re.compile(getregex("This is an example string"))

for i in matcher.finditer(filestring):
    print i.group(0), "\n"

>>> "This is "
    "an example string"

    "This is an example string"

    ""
    "This is an "
    "example"
    " string"

这个正则表达式没有考虑第三个msgid中“example”之后的空格,但我假设这是由机器生成的,这是一个错误。

是的,问题没有指定拆分是在单词边界还是字符边界上。这种方法非常聪明,但我可以看到其中的一个问题:如果字符串包含元字符,这将破坏我们的模式。我不知道该如何处理。这就是为什么我问你是否打算搜索一系列正常的单词。如果要搜索更复杂的结构,则必须以不同的方式形成正则表达式。。但问题的答案显然是:“使用”。如何以搜索模式处理任意输入是一个完全不同的问题。你可以简单地允许元字符,或者转义它们,或者提醒用户不要使用它们等等。你可以在任何一个单词上使用它,以确保它是字面上匹配的:Thx,我承认你的答案对Q的参数是正确的。我只是认为动态构造模式的方法可能会使事情变得复杂一些,最好避免在这种特定情况下使用正则表达式。当做