带括号的正则表达式

时间:2013-08-19 04:43:31

标签: regex

我正在尝试从字符串中删除以下内容:

的字符串:

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)时,我得到“(左)”,意思是包括括号,为什么会这样?

感谢。

5 个答案:

答案 0 :(得分:3)

使用否定:([(][^)]*[)])。这将与开头(匹配,然后匹配不是结束)的任意数量的字符,然后是结束)

您可以通过这种方式否定任何字符或字符集。要匹配文字^插入符号,您可以将其放在[]字符集之外或将其放在第一个字符之后的任何位置,如下所示:[a^bc]。阅读您正在使用的正则表达式语言的规则始终是一个好主意,以确切了解可能的语法和正确的语法。

贪婪或懒惰是在所有正则表达式实现中可能无法实现相同(如果有的话)的一条规则。最好明确说出你想要找到什么,而不是依赖于难以理解和调试的规则(有时)。

答案 1 :(得分:1)

限制。*仅匹配不是括号的内容:

([(][^()]*[)])

答案 2 :(得分:1)

  • 首先不需要[]一个字符。只是逃避括号
  • 其次,使用。*?非贪婪的比赛

    / \(。*?\)/

答案 3 :(得分:0)

正如pguardiario所提到的那样(我投了赞成票),你不需要一个字符类,只需要转义括号。

他的解决方案有效,但有一点需要注意:如果括号内的文字是硬包装的,.将无法捕获\n。你需要一个角色类。

我建议的解决方案:

\([^)]*\)

这会转义两端的括号,总是捕获括号内的任何内容(当然,除非它包含另一个括号子句)。

答案 4 :(得分:0)

这是风格问题,但我更喜欢[(]\(,所以我会使用([(][^)]*[)])

您尚未指定使用的语言。如果它是Perl,我会使用/ x限定允许我为清晰度添加间距

/ ( [(] [^)]* [)] ) /x