嵌套正则表达式(python)

时间:2015-04-28 21:25:07

标签: python regex

我无法为以下内容编写正则表达式。我有一个文字向量(参见RE_LIT),我想在一行文本中找到所有向量,但我在编写正则表达式时遇到困难。具体来说,我似乎有问题,括号作为组而不是括号。

RE_LABEL1 = r'[cvx]\d+(?![.]r)$'
RE_LABEL2 = r'v\d+\.r\d+'
RE_LABEL = r'(%s)|(%s)' % (RE_LABEL1, RE_LABEL2)
RE_LIT = r'!?%s' % RE_LABEL
RE_VEC = r'\[\s*(\s*%s\s*,?\s*)+\s*\]' % RE_LIT

要匹配的示例字符串:

test = 'c1 = blah([v3,v4,v5.r1,!v6,v7,x8,v9,v10], [v1, v2], [x5.r1])'

预期结果:

> print re.findall(RE_VEC, test)
['[v3,v4,v5.r1,!v6,v7,x8,v9,v10]', '[v1, v2]']

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用以下修复程序:

import re
RE_LABEL1 = r'[cvx]\d+(?![.]r)'
RE_LABEL2 = r'v\d+\.r\d+'
RE_LABEL = r'%s|%s' % (RE_LABEL1, RE_LABEL2)
RE_LIT = r'\!?%s),?\s*' % RE_LABEL
RE_VEC = r'(?:(?:%s)+' % RE_LIT
test = '[v3,v4,v5.r1,!v6,v7,x8,v9,v10], [v1, v2]'
print re.findall(RE_VEC, test)

输出IDEONE demo

['v3,v4,v5.r1,!v6,v7,x8,v9,v10', 'v1, v2']

答案 1 :(得分:0)

import re
RE_LABEL1 = r'[cvx]\d+(?=[ ,\]])'
RE_LABEL2 = r'v\d+\.r\d+(?=[ ,\]])'
RE_LABEL = r'%s|%s' % (RE_LABEL1, RE_LABEL2)
RE_LIT = r'\!?%s' % RE_LABEL
RE_VEC = r'\[\s*(?:(?:\s*%s\s*\s*),?)+\s*\]' % RE_LIT
test = '[v3,v4,v5.r1,!v6,v7,x8,v9,v10], [v1, v2], [v1, x2.r2]'
print re.findall(RE_VEC, test)

谢谢stribizhev的帮助,它让我走了一半路。以上是最终的解决方案。