【问题标题】:Having some trouble with regex and double brackets正则表达式和双括号有一些问题
【发布时间】:2016-07-26 08:22:52
【问题描述】:

我对正则表达式有一些经验,但我无法弄清楚以下内容。如果我有这样的字符串:

'[[1,2,3],[3,5,3],[9,8,9]] aoeu [5,6,9] aoeu [[4,5,5]]'

分别提取[[1,2,3],[3,5,3],[9,8,9]][[4,5,5]] 的正则表达式模式是什么? (封闭双括号内的任何组)。很明显'\[\[.*\]\]'这个模式太贪心了……

【问题讨论】:

  • 让它不贪婪:- \[\[.*?\]\] 检查:-regex101.com/r/qZ3fA1/2
  • 如果输入是'[[1,2,3],[3,5,3],3] bar [2,3]'?,输出会是什么
  • @AvinashRaj 你的意思是使用“rock321987”中的正则表达式吗?
  • @steveb 我要求 op 进一步澄清..
  • @AvinashRaj 在您的问题中(对于模式'[[1,2,3],[3,5,3],3] bar [2,3]'),来自rock321987 \[\[.*?\]\] 的正则表达式将不匹配任何内容,因为]] 不存在。

标签: python regex nested


【解决方案1】:

如果输入完全符合您的模式,那么您可以使用它来制作您的 regex non-greedy

p = re.compile(ur'\[\[.*?\]\]')
test_str = u"[[1,2,3],[3,5,3],[9,8,9]] aoeu [5,6,9] aoeu [[4,5,5]]"
print(re.findall(p, test_str))

要处理[[1,2,3],[3,5,3],3][1,2,3,[3,5,3],3] 等情况,请使用此正则表达式

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

REGEX DEMO

IDEONE DEMO

【讨论】:

  • 谢谢!这回答了我的问题。提到的第二种情况不应该出现在我的例子中,因为它们代表数学表达式中的矩阵。
  • 该死的,太晚了:)
  • 是的,我想我只是不完全清楚/意识到懒惰与贪婪。我有一些阅读/练习要做。
  • @Jan 实际上,我一出现问题就写了答案,但正在等待op's 澄清。最后我将其发布为OP 没有澄清
【解决方案2】:

如果您能够使用 Matthew Barnett 的(更好的)regex module,您可以想出一些 \G 魔法:

(?:(?:\[)|(?!\A)\G)[^][]*(\[[^]]+\])

分解并使用 Python 代码,这将是:

import regex as re

rx = re.compile(r"""
    (?:             # non capturing group
        (?:\[)      # an open bracket
        |           # OR
        (?!\A)\G    # make sure it's not the beginning... 
                    # ...and that it is the start of the last match
    )
    [^][]*          # not a [ or ]
    (\[[^]]+\])     # capture anything between two brackets
    """, re.VERBOSE)

string = '[[1,2,3],[3,5,3],[9,8,9]] aoeu [5,6,9] aoeu [[4,5,5]]'

matches = [match.group(1) for match in rx.finditer(string)]
print matches
# ['[1,2,3]', '[3,5,3]', '[9,8,9]', '[4,5,5]']

另外请参阅 demo on regex101.com

【讨论】:

  • 从未使用过regexpython 库,但我这边的+1 很好解释
  • @rock321987:谢谢。考虑尝试一下,它真的好得多(原文如此!),因为它提供了PCRE 的一些功能(\G(*SKIP)(*FAIL) 仅举几例)。
  • 当然,我会试一试
猜你喜欢
  • 1970-01-01
  • 2015-10-13
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多