2016-04-26 9 views
1

次の文字列を持っている想像して置き換えます。Pythonの正規表現は、いくつかの言葉が、すべてが

"badger mushroom badger mushroom mushroom mushroom" 

しかし、私は正規表現が「おばあちゃんとキノコの言葉以外のすべて」に一致することはありません。手伝って頂けますか?

+0

ベイダーやキノコのためにチェックし、それを否定しますか? – Mathias711

+1

https://regex101.com/r/aV4rE9/1 – rock321987

+0

私は非正規表現の回答を投稿することができますが、それも良いでしょうか?正規表現は時々圧倒される! – linusg

答えて

2

これは

p = re.compile(r'(?!\bbadger\b|\bmushroom\b)\b[^\s]+\b') 
test_str = "badger randomword badger mushroom mushroom somethingelse" 
subst = "mushroom" 
result = re.sub(p, subst, test_str) 

Ideone Demo

(?!\bbadger\b|\bmushroom\b)\b[^\s]+\b 

Regex Demo

Pythonのコードを動作します

+0

ありがとうございます。私は否定的な先読みについて読むつもりです –

+0

@EduardoAlmeidaあなたはサイトを使用することができますhttps://regex101.com/ それは正規表現で何が起こっているのいくつかの簡単な説明があります – rock321987

1

あなたは本当に単純なパターンになるだろう関数のパラメータを持つre.sub使用することができます

oldstring = "badger randomword badger mushroom mushroom somethingelse" 
newstring = "" 

for part in oldstring.split(" "): 
    if part in ["badger", "mushroom"]: 
     newstring += part 
    else: 
     newstring += "mushroom" 
    newstring += " " 

newstring = newstring[:-1] 
0

非正規表現溶液(と、より読みやすいし)、このことでしょうこのタスクを実行する-regex onelinerは次のようになります。 -

new_string = ' '.join(word if word == 'badger' else 'mushroom' for word in original_string.split()) 

ここでは、複雑な正規表現を使用することをお勧めします。sinc Pythonのe Beautiful Is Better Than Ugly

2

簡単な非:

import re 

s = "badger randomword badger mushroom mushroom somethingelse" 
re.sub('\w+', lambda x: 'badger' if x.group(0) == 'badger' else 'mushroom', s) 
0

この

(?!badger\b)\b\w+\b 

Regex demo

説明してみてください。
(?!…):否定先読みsample
\: "単語文字":特殊文字sample
\wエスケープASCII文字を、数字またはアンダースコアsample
+:1つまたは複数のsample

Pythonの

import re 
p = re.compile(ur'(?!badger\b)\b\w+\b') 
test_str = u"badger randomword badger mushroom mushroom somethingelse" 
subst = u"mushroom" 

result = re.sub(p, subst, test_str)#badger mushroom badger mushroom mushroom mushroom 
関連する問題