2015-04-28 78 views
2

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

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]'] 

谢谢你的时间提前对您有所帮助。

+1

*“我似乎有问题,括号作为组而不是括号”* - 括号在正则表达式中有含义。如果你希望它们只是字符,*用前缀反斜杠*转义它们:'\('。你的例子不是一个非常有用的测试,因为'r'\ [[^]] +]''可以正常工作... – jonrsharpe

+0

Jonrsharpe:如果我要使用这种方法,我将如何确保列表中的条目是文字(RE_LIT)而不仅仅是字符? – fcimeson

+0

是的括号在正则表达式中有意义,但是是否有一些机制会像圆括号通常用于嵌套? – fcimeson

回答

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'] 
+0

这是否适合您或您需要另一种方法? –

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的帮助,这让我的存在方式的一半。以上是最终解决方案。