2016-01-21 280 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

没错!我应该深入学习正则表达式。感谢您的答复! –