4

複数の行に任意に分割された文字列を正規表現で一致させる方法はありますか?ファイルに次の形式があるとします:

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 "..."

したがって、すべての例の文字列に一致するパターンが必要です。つまり、文字列が行間でどのように分割されているかに関係なく、文字列に一致します。サンプルに示されているように、単なる文字列ではなく、特定の文字列を探していることに注意してください。したがって、この場合は string に一致させたいと思います"This is an example string"

もちろん、文字列を簡単に連結して一致を適用することもできますが、これが可能かどうか疑問に思いました。私はPythonの正規表現について話していますが、一般的な答えは大丈夫です。

4

2 に答える 2

4

一連の単語を一致させますか? その場合、\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'
于 2012-05-05T06:42:54.263 に答える
0

これは、すべての行に引用符が必要であり、空の行が許可されているため、少し注意が必要です。あなたが正しく投稿したファイルに一致する正規表現は次のとおりです。

'(""\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)*" )| )

これは、各単語の後に「スペース、引用、改行、(空の文字列の無制限の数)引用」、または同じシーケンスであるが最後までのスペースが多い、または単なるスペースの3つの異なる可能性をチェックします。

これを機能させるためのはるかに簡単な方法は、一致させようとしている文字列を受け取り、それに一致する正規表現を返す小さな関数を作成することです。

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"

この正規表現は、3 番目の msgid の "example" の後にあるスペースを考慮していませんが、これはマシンによって生成されたものであり、それは間違いだと思います。

于 2012-05-05T07:30:22.593 に答える