【问题标题】:How can I make a regular expression that only matches the middle bracket of nested brackets?如何制作仅匹配嵌套括号的中间括号的正则表达式?
【发布时间】:2018-04-13 15:12:30
【问题描述】:

我正在尝试制作一个仅在有嵌套括号时才匹配中间括号的正则表达式。例如,如果您输入 x(x+3(x+3)),我希望它只匹配 (x+3)。我的程序中已经有几个涉及括号的正则表达式,我发现它们总是匹配他们找到的第一个括号实例。在上面的例子中,我的正则表达式匹配 (x+3(x+3),我想这应该很明显,但我开始时没有考虑。本质上,我希望它匹配一组括号括号内不包含 '(' 或 ')' 字符。

这是我的单括号正则表达式:re.compile(r'(\S+?)')。 我会使用某种否定的环视方法,但我认为这会分别防止开头和结尾出现必要的开括号和右括号字符......

我正在使用 Python。另外,当我说“括号”时,我的意思是括号,但在英式英语中,我们说括号:)

提前致谢!

【问题讨论】:

  • 可能类似于\(.*((\.*\)).*\),使用捕获组?这很可能不是常规语法。您可能必须改为指定上下文无关语法。
  • 这个(\([^()]+\))?应该工作..见regexr.com/3nsfg
  • @PatrickArtner [^()] 我想...

标签: python regex


【解决方案1】:

捕捉不需要其他东西的东西的最简单方法是使用

[^ ....] - ^ 不允许 [] 内的任何内容 - 作为一项特殊功能,您不需要在其中转义括号 - 所以通过将您的正则表达式声明为

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

您基本上捕获了文字 ( 后跟 bei 1+ 任何东西,但既不是 ( 也不是 ) 后跟文字 )

https://regexr.com/3nsfg

来自Regex Syntax

  • 不在一个范围内的字符可以通过补集来匹配。如果集合的第一个字符是^,则所有 不在集合中的字符将被匹配。例如, [^5] 将匹配除 '5' 之外的任何字符,[^^] 将匹配任何字符 '^' 以外的字符。 ^ 如果不是第一个,则没有特殊含义 集合中的角色。
  • 要匹配集合内的文字“]”,请在其前面加上反斜杠,或将其放在集合的开头。例如,[()[\]{}][]()[{}] 都将匹配括号。

代码:

t = "x(x+3(x+3))"

import re

m = re.findall(r"(\([^()]+\))", t)

print(m[0])

输出:

(x+3)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 2011-07-18
    • 2011-07-24
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多