2017-12-18 5 views
-1

で部分的にしか文字列を置換しますが、私はテキストがあるとします。どのようにre.sub

text = 'Washington state Washington DC" 

は私が

re.sub('Washington(\s[^DC])', 'WA ', text) 
を試してみた私の新しい出力が

'WA state Washington DC' 

になりたいです

と入力し、「状態」の最初の文字を削除する次の出力を取得します。

'WA tate Washington DC' 

基本的に、「DC」の前にない限り、「ワシントン」のすべてのインスタンスを「WA」に変更する必要があります。これを行うには本当に簡単な方法があると確信しています。私の脳は今日働く気がしません! (私はPython 3.xを使用しています)助けてください!おかげ

+0

'\ bWashington state \ b'の代わりに' 'WA state'や' \ bWashington(?!)を使うことができます。 + DC) 'WAと置き換えます。 – ctwheels

答えて

4

は、このような負の先読みを使用します

Washington(?!\s*DC)

をワシントンがスペースや「DC」の質問に対して

+0

re.sub(ワシントン(?!\ s * DC)、WA、テキスト、フラグ= re.IGNORECASE) – Pat

+0

ありがとう!これは完全に機能します。否定的な先を見越して何を意味するのか説明できますか? 「?」とは何ですか?パターンの一部はどういう意味ですか?再度、感謝します! –

+1

基本的には、試合(ワシントン)を見つけて先を見て、2つ目のマッチ(DC)があるかどうかを確認してください。これは、 "yが続いていない場合はxを見つける"に最適です。解決済みの場合は、 という質問に印を付けることを忘れないでください:) – Pat

0

おかげで、任意の数が続いている場合はチェックします。それは私の比較的新しいPythonのスキルを磨くことができました。これを行うには多くの方法があります。私はこの方法を好む:

import re 

wa = "Washington state Washington DC" 

regexp = r'Washington\s' 
regexp1 = r'WA(\s+DC)' 
text = re.sub(regexp, 'WA ', wa) 
text2 = re.sub(regexp1, 'Washington DC', text) 
print(text2) 

は基本的に、それは「WA」に「ワシントンのすべての出現箇所を変更して「ワシントンDC」に「WA DC」のすべての出現をバックに変更します。

0

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

import re 
text = ["Washington state Washington DC", "the great state of Washington", "Lives in Washington DC", "I live in Washington State"] 
new_text = [re.sub('Washington(?!\sDC)', 'WA', i) for i in text] 

出力:

['WA state Washington DC', 'the great state of WA', 'Lives in Washington DC', 'I live in WA State'] 

テストケースを:

text = {"Washington state Washington DC":"WA state Washington DC", "the great state of Washington":"the great state of WA", "Lives in Washington DC":"Lives in Washington DC", "I live in Washington State":"I live in WA State"} 
for a, b in text.items(): 
    assert re.sub('Washington(?!\sDC)', 'WA', a) == b, "failed" 
print("passed") 

出力:

passed