2012-05-05 17 views
4

の上に分割する文字列を一致させることは任意に複数行に分割された文字列にマッチする正規表現の中に方法はありますすべてのサンプル文字列に一致するパターンを持つようにします。つまり、行全体にどのように分割されているかにかかわらず文字列にマッチします。サンプルに示されているように、特定の文字列だけでなく、特定の文字列の後ろにあることに注意してください。この場合、文字列"This is an example string"と一致させたいと考えています。任意だ複数行

もちろん、文字列を簡単に連結してマッチを適用することはできますが、これが可能かどうか私には不思議に思っています。私は話しているPython正規表現ですが、一般的な答えはOKです。

答えて

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' 
+0

はい分割は単語境界または文字境界にあるかどうかを指定していませんでした。しかし、同様のコンセプトが両方に適用されます。 –

+0

このアプローチは非常に巧妙ですが、文字列にメタ文字が含まれていると、パターンが壊れてしまいます。私はそれがどのように処理されるのか分かりません。 –

+0

それで、私はあなたが一連の普通の単語を検索するつもりかどうか尋ねました。より複雑な構造体を検索する場合は、正規表現を別の形にする必要がありますが、質問への答えは "use \ s"です。任意の入力を検索パターンとして扱うには、まったく異なる質問です。単にメタキャラクタを許可したり、エスケープしたり、ユーザにそれらを使用しないよう警告することができます。 – pwuertz

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)*")|) 

、いずれかの「スペース、引用符、改行、(空の文字列の数に制限)引用」、または同じSE:各単語の間にスペース終わりまでのスペース、または単にスペース。もしあれば、そう

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で「例」の後に口座にあなたが持っているスペースを取りませんが、私はこれがマシンによって生成されたと仮定し、それは間違いです。

関連する問題