2017-07-01 8 views
1

PDFからコピーしたDavid Foster Wallaceを含む.txtファイルからインポートしています。いくつかの単語は、ページをオフに走ったので、私はのようなものを使用して、それをサニタイズするつもりだった条件に従って特定の文字列スニペットを.replace()する方法はありますか?

"interr- upted" 

の形で来る:人も中にいくつかの奇妙な構造を使用しています...除き

with open(text, "r", 0) as bookFile: 
    bookString = bookFile.read().replace("- ", "") 

彼の執筆。次のようなものがあります。

"R - - d©" 

ブランド名バグスプレーRaid©私は明らかに "R d©"を残していますが、 " - "のインスタンスではなく " - "のインスタンス.replace()インスタンスを作成する方法はありますか?あるいは、すべてをリストに変換し、そのようにすべての操作を行う必要がありますか?ありがとう。

+0

どのようにこの状態を定義しますか? 1つ以上の文字、ハイフン、スペース、1つ以上の文字がある場合のみですか? – jacoblaw

+0

良い点。私はその事件をもっと一般的にして、将来の本に同じことをすると、 "a - b"のインスタンスはすべて破棄されないだろうが、 "ab - c" "abc"に変わります。 –

答えて

3

負のlookbehindアサーションを含む正規表現を使用して前の文字を確認し、re.subを使用して一致を空の文字列に置き換えることができます。

'(?<!)- ''- 'のすべてのインスタンスに一致する、単一の空白文字(構文についてthisセクションを参照)によって先行正規表現ではありません。 re.sub('(?<!)- ', '', input_string)input_string'(?<!)- 'パターンのすべての出現を''(空文字列)に置き換えて結果を返します。

例:

In [1]: import re 

In [2]: re.sub('(?<!)- ', '', 'interr- upted') 
Out[2]: 'interrupted' 

In [3]: re.sub('(?<!)- ', '', 'R - - d©') 
Out[3]: 'R - - d©' 
+0

これは完全に機能しました。私の入力はテキストファイル全体が1つの文字列だったため、 " - d"や "f - k"などの一般的なハイフネーションを破棄することなく " - "のすべてのインスタンスを切り捨てました。あなたが選んだre.sub()引数で何が起こっているのか説明できる可能性はありますか?ドキュメントは少し紛らわしく、以前は正規表現を使用していませんでした。 –

+1

@ LukeMcPuke私はそれをよりよく説明しようとしました、更新された答えを確認してください。その正規表現の完全な説明はリンクされたドキュメントと[this](https://regex101.com/r/5HNEha/1)のページ – vaultah

2

あなたは、置換する必要がある唯一の出現を置き換えることを確認するlookbehindsと先読みを使用することができます。

>>> import re 
>>> regex_pattern = '(?<=[a-z])(-)(?=[a-z])' 
>>> re.sub(regex_pattern, '', "interr- upted", re.I) 
'interrupted' 

そして、

>>> re.sub(regex_pattern, '', "R - - d©") 
'R - - d©' 

後者は影響を受けません。

-2

これはあなたが必要とするものですか?

In [23]: import re 
In [24]: re.sub(r'- ', '', '"R - - d"') 
Out[24]: '"R d"' 

Thisリンクはお役に立ちます。

HTH

+0

を参照してください。いいえ、OPは非常に明確にこれが必要なものではないと言いました。 –

関連する問題