我正在尝试从字符串中删除以下内容:
的字符串:
Snowden (left), whose whereabouts remain unknown, made the extraordinary claim as his father, Lon (right), told US television he intended to travel
我正在使用以下正则表达式:([(].*[)])
,但它匹配:
(left), whose whereabouts remain unknown, made the extraordinary claim as his father, Lon (right)
哪个有道理,但不是我想要的。
我该怎么做才能解决这个问题?它与贪婪或懒惰有关吗?
编辑:
我正在使用Python:
paren = re.findall(ur'([(\u0028][^)\u0029]*[)\u0029])', text, re.UNICODE)
if paren is not None:
text = re.sub(s, '', text)
这导致以下输出:
Snowden (), whose whereabouts remain unknown, made the extraordinary claim as his father, Lon (), told US television he intended to travel
然而,当我打印paren.group(0)时,我得到“(左)”,意思是包括括号,为什么会这样?
感谢。
答案 0 :(得分:3)
使用否定:([(][^)]*[)])
。这将与开头(
匹配,然后匹配不是结束)
的任意数量的字符,然后是结束)
。
您可以通过这种方式否定任何字符或字符集。要匹配文字^
插入符号,您可以将其放在[]
字符集之外或将其放在第一个字符之后的任何位置,如下所示:[a^bc]
。阅读您正在使用的正则表达式语言的规则始终是一个好主意,以确切了解可能的语法和正确的语法。
贪婪或懒惰是在所有正则表达式实现中可能无法实现相同(如果有的话)的一条规则。最好明确说出你想要找到什么,而不是依赖于难以理解和调试的规则(有时)。
答案 1 :(得分:1)
限制。*仅匹配不是括号的内容:
([(][^()]*[)])
答案 2 :(得分:1)
其次,使用。*?非贪婪的比赛
/ \(。*?\)/
答案 3 :(得分:0)
正如pguardiario所提到的那样(我投了赞成票),你不需要一个字符类,只需要转义括号。
他的解决方案有效,但有一点需要注意:如果括号内的文字是硬包装的,.
将无法捕获\n
。你需要一个角色类。
我建议的解决方案:
\([^)]*\)
这会转义两端的括号,总是捕获括号内的任何内容(当然,除非它包含另一个括号子句)。
答案 4 :(得分:0)
这是风格问题,但我更喜欢[(]
到\(
,所以我会使用([(][^)]*[)])
您尚未指定使用的语言。如果它是Perl,我会使用/ x限定允许我为清晰度添加间距
/ ( [(] [^)]* [)] ) /x