我看过这个帖子: javascript regex -- only produces last letter in (.)+ group?
那里提供的解决方案在我的案例中没有帮助;我尝试了什么:
^{[^d]*([\d\-]+),([\d\-]+)[^d]*{?(\d+)}?[^}]+}$
我们需要将解析字符串{left/(-1,0)/$\upsilon_{11}$}
和{left/(1,0)/$\upsilon_{1}$}
作为
[(-1,0,11),(1,0,1)].
不幸的是,我得到了:
[(1,0,1),(1,0,1)].
如何更改?
答案 0 :(得分: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')