【问题标题】:python regex for matching "[ab[cd]]fg[hi]]" [closed]用于匹配“[ab[cd]]fg[hi]]”的python正则表达式[关闭]
【发布时间】:2019-03-15 05:41:18
【问题描述】:
s = "[ab[cd]]fg[hi]"

我想得到子字符串[ab[cd]] 真正的问题是可以有任意数量的开括号和闭括号。供参考this 是我要解决的问题。

如果我使用re.search("\[(.*)\]", s),它匹配最后一个]

如果我使用re.search("\[(.*?)\]", s),它会停在第一个]

我希望正则表达式匹配 [ab[cd]] 字符串 [ab[cd]]fg[hi] 并匹配 [ab[cd[ef]]] 字符串 [ab[cd[ef]]]f[hi]

有什么想法吗?

谢谢

【问题讨论】:

  • \[\w+\[\w+\]\] 怎么样?
  • 我不知道它可能包含多少嵌套的左括号和右括号。
  • 那么,选择[ab[cd]]fg[hi][ab[cd]]fg[hi] 之间的区别因素是什么?
  • 当我遍历字符串时,如果我遇到一个'[',那么我需要找到它匹配的']并做一些处理。这是一个编程问题:leetcode.com/problems/decode-string
  • 我的建议是将搜索乘数和相应的“字符串”分开,然后使用递归替换出现的位置。我编写了一个工作示例,它似乎可以工作。

标签: python regex python-3.x string


【解决方案1】:

除非您事先知道括号嵌套的可能数量的限制,否则 re 模块是不可能的 - 但是,regex 模块可以通过递归来做到这一点:

\[(?:[a-z]|(?R))*\]

https://regex101.com/r/Al0jny/1

使用re,您必须手动尝试匹配可能的嵌套级别,例如:

\[(?:[a-z]|\[[a-z]*\])*\]

【讨论】:

  • 这行得通。让我试一试。谢谢!
【解决方案2】:

我认为这取决于输入。但是,根据您引用的链接上的输入,也许它会有所帮助。

(\d+)|(\[[a-z]\])|(\[[a-z]+\])|([a-z]+)

https://regex101.com/r/RRTLIU/1

或者如果你想忽略方括号,你可以使用这个regex

(\d+)|\[([a-z])\]|\[([a-z]+)\]|([a-z]+)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多