2017-12-11 7 views
1

私は以下のように単語フレーズと文字列のリストを持っています。Pythonの文字列中の特定の語句を特定します

mylist = ['and rock, 'shake well', 'the'] 
mystring = "the sand rock need to be mixed and shake well" 

私は""mylist内の単語を置き換えたいです。

私は現在、次のようにpythonでreplaceメソッドを使用しています。

for item in mylist: 
     mystring = mystring.replace(item, "") 

Howver、私はそれがすべての私の文章ではうまくいかないと指摘しました。たとえば、mystringの場合、偽の一致がsand rockであり、次のように出力されます。

s need to be mixed and 

Howver、私はそれをそのままにしたい。

sand rock need to be mixed and 

これをPythonで行うより良い方法はありますか?

+0

...か正規表現を使用してください。 –

答えて

2

問題は、str.replace()では、単語全体(またはフレーズ)のみを一致させたいという指定はできません。 reモジュールでは、正規表現(正規表現)を使用してパターンマッチングを行うことができます。正規表現では、\bエスケープを使って単語の境界を指定することができます。 \bをフレーズの前後にエスケープして、単語の境界でのみ一致するようにします。 re.sub()機能がstr.replace()方法と同じように動作し、あなたのようなあなたのコードでそれを使用することができます。

import re 
mylist = ['and rock', 'shake well', 'the'] 
mystring = "the sand rock need to be mixed and shake well" 
for item in mylist: 
     mystring = re.sub(r"\b{}\b".format(item), "", mystring)   
print(mystring) 

Out[6]: ' sand rock need to be mixed and ' 
+0

これは、フレーズの最初の出現を削除するだけです。 –

+1

@JohnGordonあなたは本当ですか?私はちょうど 'mystring = 'the the' 'でテストし、' '' 'を得ました。 [res()のドキュメント](https://docs.python.org/3/library/re.html#re.sub)によると、 "オプション引数の数は、パターンの出現回数の最大値ですcountは負でない整数でなければなりません。省略またはゼロの場合は、すべての値が置き換えられます。_ " – Craig

+0

私は修正しました。私は 're'で多くのことをしていないので、不当な前提のために私には恥ずかしいです。 –

2

問題のトリックの一部は、あなたが単語の一部と一致したくないということです。だから、replace()メソッドは、あなたがしたいことをしません。あなたは正規表現を通して望みを達成することができます。 REについての良い点の1つは、\bフラグを使用してワード境界に一致させることができることです。

0

re.subを使用し、正確な文字列に

import re  
re.sub('\b'+'|'.join(mylist), '', mystring) 
#' sand rock need to be mixed and ' 
に一致するように \b(ワード境界)を適用すること= [ 'と岩'、 'よく振っ'、 ''] `` mylistにあなたのリストを変更
関連する問題