2017-10-23 16 views
1

のリストに含まれている場合、私は次の文字列を持っている文字列内の単語を置き換えます。出力はは、それが言葉

'何が本当に起こっていない、月1999年に月1999年と同じ'

よう

for month in month_set: 
    sentence = s.replace(month, 'date') 
    print(sentence) 

になりますが、それは次のように返さ:

in may 1999, nothing really happened, same as in june 1999 
in date 1999, nothing really happened, same as in june 1999 
in may 1999, nothing really happened, same as in date 1999 

上記の場合、私はそれを遅くする大きな文字列に適用する必要があります。

+2

速度はその後、正規表現の問題である場合おそらく最も速い方法でしょう – chasmani

答えて

1

あなたはこれを試すことができます。

s = 'in may 1999, nothing really happened, same as in june 1999' 
month_set = {'may', 'june', 'july'} 
final_string = ' '.join("month" if i in month_set else i for i in s.split()) 

出力:

'in month 1999, nothing really happened, same as in month 1999' 

純粋な正規表現のソリューション:

import re 
s = 'in may 1999, nothing really happened, same as in june 1999' 
month_set = {'may', 'june', 'july'} 
final_string = re.sub('|'.join("(?<=\s){}(?=\s)".format(i) for i in month_set), 'month', s) 
print(final_string) 
s1 = 'may june mayor' 
final_string1 = re.sub('|'.join("((?<=\s)|(?<=^)){}((?=\s)|(?=$))".format(i) for i in month_set), 'month', s1) 
print(final_string1) 

出力:

'in month 1999, nothing really happened, same as in month 1999' 
'month month mayor' 
+0

正規表現はより効率的ですが、とにかくそれは全体の単語だけを置き換えますか? 'mayor'を' dateor'に置き換えないようにしたい – athraa

+0

@athraa正しいですが、正規表現で提供されている文字列と完全に一致する値だけを置き換えます。 – Ajax1234

+0

単語全体を選択するように変更できますか? – athraa

1

あなたの問題は、sentenceがループ内でローカルであることです。各反復では、その反復の代わりにsという値が割り当てられます。 sと交換して、各繰り返しでの変更が実際に維持されるようにしてください。すなわち:

for month in month_set: 
    s = s.replace(month, 'date') 
print(s) 
+1

それに殴られる。 :) – Withnail

1

使用正規表現:

import re 
months = ['May', 'June'] 
myRegex = re.compile("|".join(months)) 
myRegex.sub("Month", "Welcome to May, next is June") 

このバージョンでは、大文字と小文字が区別されていますが、大文字と小文字を区別しないバージョンをしたい場合だけ使用します。

myRegex = re.compile("|".join(months), re.IGNORECASE)