这有点棘手,因为每行都需要引号,并且允许空行。这是一个与您正确发布的文件匹配的正则表达式:
'(""\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 中“示例”之后的空间,但我认为这是由机器生成的,这是一个错误。