2016-01-21 233 views
0

我是新來的Python和我想刪除並替換({// })與空間,下面Python的正則表達式刪除Word用正則表達式

原判樣本:

NULL ({// }) Regina ({ 4 p1 p2// }) Shueller ({ 5 p1 p2// }) works ({// }) for ({// }) Italy ({ 14// }) 's ({ 15// }) La ({ 16// }) Repubblica ({ 17// }) newspaper ({ 18// }) . ({ 38// }) 

變換到這一點:

Regina Shueller works for Italy 's La Repubblica newspaper. 

我試過這個代碼,但是這不是我所期待

Sentence = re.sub(r'[({// })]',' ', sentence) 
+0

什麼NULL? –

+0

我想出的最好的是['r'\ s *(?:\(\ {[^ /] */\ s */\ s *} \)| NULL)\ s *''](https: //regex101.com/r/nJ4yY8/1)(用空格替換)。但是最後一個詞和'.'之間的空格不能這樣刪除。值必須從空格中刪除。 –

+0

您轉換後的字符串與您所說的內容不匹配 –

回答

0

您可以使用

r'\s*(?:\(\{[^/]*/\s*/\s*}\)|NULL)\s*' 

regex demo

正則表達式的解釋

  • \s* - 零個或多個空格
  • (?:\(\{[^/]*/\s*/\s*}\)|NULL) - 兩個備選方案,NULL\(\{[^/]*/\s*/\s*}\)相配
    • \( - 開口輪托架
    • \{ - 開括號
    • [^/]* - 零個或多於/
    • /其他字符 - 字面/
    • \s* - 零個或多個空格
    • /\s* - 同上。
    • } - 一個閉括號
    • \) - 閉合圓形托架
  • \s* - 零個或多個空格

注意,在字和標點之間的空間應分開處理。

Python demo

import re 
p = r'\s*(?:\(\{[^/]*/\s*/\s*}\)|NULL)\s*' 
test_str = "NULL ({// }) Regina ({ 4 p1 p2// }) Shueller ({ 5 p1 p2// }) works ({// }) for ({// }) Italy ({ 14// }) 's ({ 15// }) La ({ 16// }) Repubblica ({ 17// }) newspaper ({ 18// }) . ({ 38// })" 
result = re.sub(p, " ", test_str) 
print(result.strip()) 
# => Regina Shueller works for Italy 's La Repubblica newspaper . 
+0

作爲獎勵:),請嘗試使用're.sub(r「\ s +([〜\'!@#$%^&*)_ + =} \] \ \刪除非開放標點符號和符號之前的空格|;:。>, - ])「,r」\ 1「,result.strip())' –

+1

嗯,不知道這個答案有什麼問題。 –

+1

downvote的人 - 真的,什麼是錯的? –

0

你可以用這個去:

r'(\([^(]*\))' 

隨着live demo

+1

我認爲這個正則表達式對於這個任務來說是相當不安全的。 –

+2

@WiktorStribiżewwell ...它符合需求,給出提供的輸入。我儘可能地簡化了它,如果提供的輸入不能反映現實,這可能會很糟糕。 –

0

如果格式總是你可以嘗試保持阿爾法的剝離標點後相同:

from string import punctuation 
print(" ".join([w for w in s.split() if w.strip(punctuation).isalpha()])) 

或者使用一個正則表達式:

print(re.sub(r'\({.*?}\)',"",s)) 

無論預期輸出中的內容如何,​​您都將刪除所有有({})的內容。

+0

匹配正則表達式的懶點[可能會對你開玩笑](https://regex101.com/r/dQ4zT0/1)。不要在你不需要的地方使用懶點匹配。 –

+0

@WiktorStribiżew,我確實需要它,我的意思是從模式中刪除//,因爲它不是我希望根據預期輸出匹配的OP。裏面是什麼無關 –

1

您嘗試的模式:r'[({// })]'手段:

匹配任何單個字符的(之一,{/},或)

這裏的關鍵是理解regular expression language。這些字符中的每一個都具有該語言中的特殊含義。

諸如r' \({ [^/]*//}\) '之類的模式將匹配您示例中的每個不同部分。

+0

沒錯!我應該深入學習正則表達式。感謝您的答覆! –