2017-09-22 10 views
-3

を繰り返している場合、一致を避けるために否定先読み私はどのように私は次のことを達成することができますを把握しようとしている:Pythonの正規表現 - ワードは

マッチ文字列全体それは言葉"hello"単語が含まれている場合"supernova"両方ともではなく、が文字列で繰り返されています。例えば

"hello i am a supernova hello bye" NOT MATCH 
"hello i am a test bye" NOT MATCH 
"hello i am a supernova supernova bye" NOT MATCH 
"hello i am a supernova" MATCH --> result: "hello i am a supernova" 

これを解決するために、私は私が当初検討したものから開始しました:私は繰り返し同じ単語を持っている場合、一致しません。私が理解していることは、一つの方法は否定的な先読みを使用することですが、実際には何かを理解することはできません。

誰かが私にヒントをお願いできますか?

おかげ

UPDATE [SOLVED]私は問題を解決していると私は、文字列全体を一致させることができ、完全な正規表現を書くsucceded

場合と、少なくとも二つの異なる単語がある場合にのみ

\A(?!.*\b(hello|supernova)\s.*\b\1\b).*\Z 

最初の部分を繰り返さないゼロな長否定先読み(文字列ではありませんかどうかを確認です(.... \ B?!):続くすべて.*は、単語境界、followeb (hello|supernova) hello OR超新星、次に\s空白、それに続く.*、それに続く\b単語境界、\1括弧間に含まれるものである「グループ1」に取り込まれるもの(hello OR supernova)の前に(...)、その後に\bの単語境界が続きます。

これらのものがすべて存在しない場合は、\Zの前に文字列全体を.*と一致させることができます。 \A\Zは文字列の先頭と末尾です。

文字列内の位置は、先読みの実行中は変更されません。

string.count()を使用して

+0

私はPythonの文字列のドキュメントを見、より明確にあなたがこれまでに試したものを表示するようにあなたの質問を編集することをお勧めしたいです。 2番目の段落に少し触れましたが、これまでに試したことは不明です(少なくとも私にとって)。 –

答えて

1

に答えみんなに感謝:

を基本的には、あなたが時間"hello""supernova"の数は、文字列に表示された場合Trueを返すようにしたいが1それぞれに等しいです。

def test(string): 
    return string.count("hello") == 1 and string.count("supernova") == 1 

をし、いくつかのテストを与える:あなたはそうのようにチェックするために.count()を使用することができます

あなたはregex、あなたはできるだけre.findallを使用する必要がある場合:

test("hello i am a supernova hello bye")  # --> False 

test("hello i am a test bye")    # --> False 

test("hello i am a supernova supernova bye") # --> False 

test("hello i am a supernova")    # --> True 

regexを使用しますexpressions'hello''supernova'に一致し、両方に一致する長さがに等しいかどうかを確認します10。以下のような

何か:

import re 

def test(string): 
    return len(re.findall("hello", string)) == 1 and len(re.findall("supernova", string)) == 1 

上記と同じ結果を与えます。

・ホープこのことができます:)

+0

...そこにいたらどうしますか? –

+0

@QPaysTaxesいいえ、ちょうど答えを入力する前に素早く答えてください。 –

+0

母、十分です。私たちの最善を尽くす。 –