0

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

细绳:

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) 时,我得到“(左)”,这意味着括号包括在内,这是为什么呢?

谢谢。

4

5 回答 5

3

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

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

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

于 2013-08-19T04:48:39.953 回答
1
  • 首先,单个字符不需要 []。只需转义括号
  • 其次,使用 .*? 对于非贪婪匹配

    /\(.*?\)/

于 2013-08-19T05:46:06.237 回答
1

将 .* 限制为仅匹配非括号的内容:

([(][^()]*[)])
于 2013-08-19T04:48:04.170 回答
0

正如 pguardiario 提到的(我赞成),您不需要字符类,只需转义括号即可。

他的解决方案将起作用,但需要注意一点:如果括号内的文本是硬包装的,.则不会捕获\n. 你需要一个字符类。

我提出的解决方案:

\([^)]*\)

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

于 2013-08-19T06:04:14.253 回答
0

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

您尚未指定您使用的语言。如果是 Perl,我会使用 /x 限定允许我添加间距以清楚起见

/ ( [(] [^)]* [)] ) /x
于 2013-08-19T07:09:43.747 回答