2014-07-23 140 views
0

我看到这个线程: javascript regex -- only produces last letter in (.)+ group?正则表达式:符号组缺少

的解决方案,提供了有没有我的情况下帮助;我的尝试:

^{[^d]*([\d\-]+),([\d\-]+)[^d]*{?(\d+)}?[^}]+}$ 

Online demo at regex101.com

我们需要解析字符串{left/(-1,0)/$\upsilon_{11}$}{left/(1,0)/$\upsilon_{1}$}

[(-1,0,11),(1,0,1)]. 

不幸的是,我得到:

[(1,0,1),(1,0,1)]. 

如何改变呢?

+0

的Martijn Pieters的,谢谢你改变的问题! –

回答

2

您需要包括在开始负字符类-

^{[^d-]*([\d\-]+),([\d-]+)[^d]*{?(\d+)}?[^}]+}$ 

使其成为非贪婪将有助于太:

^{[^d-]*?([\d\-]+),([\d-]+)[^d]*?{?(\d+)}?[^}]+}$ 

演示在regex101.com

的Python会话:

>>> import re 
>>> pattern = re.compile(r'^{[^d-]*?([\d\-]+),([\d-]+)[^d]*?{?(\d+)}?[^}]+}$', re.M) 
>>> pattern.search('{left/(-1,0)/$\upsilon_{11}$}').groups() 
('-1', '0', '11') 
>>> pattern.search('{left/(1,0)/$\upsilon_{1}$}').groups() 
('1', '0', '1') 
+0

我稍微误解了原始的正则表达式,但有了你的帮助,我得到了我想要的:http://regex101.com/r/bR0lI8/3非常感谢! –

+0

@QueueOverflow:啊,是的,需要第二个'*?';更新。 –

+0

+1,用于很好的故障排除和包括示例代码:) – zx81