使用正则表达式和双括号遇到了一些问题。

3
我有一些正则表达式的经验,但是我无法解决以下问题。如果我有一个字符串:
'[[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]]?(任何在封闭的双方括号内的组)。显然,'\[\[.*\]\]'模式太贪婪了...

5
让它变为非贪婪模式:- \[\[.*?\]\]检查:-https://regex101.com/r/qZ3fA1/2 - rock321987
2
如果输入是 '[[1,2,3],[3,5,3],3] bar [2,3]',输出会是什么? - Avinash Raj
@AvinashRaj 你的意思是使用来自“rock321987”的正则表达式吗? - steveb
@steveb 我正在向楼主请求进一步的澄清。 - Avinash Raj
@AvinashRaj 在你的问题中(针对模式 '[[1,2,3],[3,5,3],3] bar [2,3]'),来自 rock321987 的正则表达式 \[\[.*?\]\] 不会匹配任何内容,因为 ]] 不存在。 - steveb
显示剩余6条评论
2个回答

2

如果输入恰好符合您的模式,则可以使用此方法使您的regex变为非贪婪匹配

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]等情况,请使用以下正则表达式

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

正则表达式演示

IDEONE演示


谢谢!这回答了我的问题。第二种情况不应该出现在我的情况中,因为它们代表数学表达式中的矩阵。 - dieggsy
太晚了,糟糕! - Jan
1
是啊,我想我只是在懒惰与贪婪的区别上没有完全清晰地认识/意识到。我有一些阅读和练习要做。 - dieggsy
@Jan 实际上,我在问题出现后就写好了答案,但一直在等待“提问者”的澄清。最终,由于“提问者”没有澄清,我才发布了答案。 - rock321987

1

如果您能够使用(更好的)正则表达式模块(作者为Matthew Barnett),那么您可以想出一些\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]']

请查看regex101.com上的演示,此外。


我从未使用过Python的regex库,但是对于好的解释,我会给予加一的评价。 - rock321987
@rock321987:谢谢。不过考虑试一下,它真的比较好,因为它还提供了一些PCRE所具有的功能(例如\G(*SKIP)(*FAIL)等)。 - Jan
当然,我会尝试一下。 - rock321987

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接