【问题标题】:Searching for outermost parentheses using Python regex使用 Python 正则表达式搜索最外面的括号
【发布时间】:2013-04-07 16:33:48
【问题描述】:

抱歉标题模棱两可,但我不知道如何用一句话来表达我的问题。

所以我有一些简单的正则表达式代码来提取括号之间的代码。

^.*\((.*)\).*

使用以下代码在 Python 中成功运行。

m = re.search( "^.*\((.*)\).*" ,input)
if m:
    print(m.groups()[0])

当右括号) 可能位于最外面的括号内时,就会出现我的问题。例如,我当前给出的代码

nsfnje (19(33)22) sfssf

作为输入会返回

19(33

但我希望它返回。

19(33)22

我不知道如何解决这个问题,所以任何帮助将不胜感激!

【问题讨论】:

    标签: python regex string


    【解决方案1】:
    >>> input = "nsfnje (19(33)22) sfssf"
    >>> re.search( "\((.*)\)" ,input).group(1)
    '19(33)22'
    

    请注意,这会搜索最外面的括号,即使它们不平衡(例如 "(1(2)))))")。无法使用单个标准正则表达式搜索平衡括号。如需更多信息,请参阅this answer

    【讨论】:

    • This question 有更多详细信息说明为什么正则表达式不适用于一般嵌套以及如果您确实需要一些替代方法。
    • 如果你想对花括号做同样的事情,只需将\(替换为{,将\)替换为}re.search("{(.*)}", text, re.S).group(1)。此外,要使. 匹配换行符,需要re.Sre.DOTALLre.search("\((.*)\)", text, re.DOTALL).group(1)
    【解决方案2】:

    你的代码没有给出19(33,它给出了33)22

    问题在于,正则表达式开头的 ^.* 一直匹配到字符串中的 last (,而您实际上想要匹配 from第一个字符串中的(

    如果您只想要最外面的括号内的内容,则删除正则表达式开头的.*,您也可以删除结尾的.*,因为它同样没有任何作用。

    "\((.*)\)"
    

    如果您想要匹配整行/字符串以及括号内的内容,则通过添加 ? 来懒惰地匹配第一个 *

    "^.*?\((.*)\).*"
    

    或者更好,使用

    "^[^(]*\((.*)\).*"
    

    【讨论】:

      猜你喜欢
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      相关资源
      最近更新 更多