2011-12-13 32 views
2

想象一下:如何使用正则表达式将该字符串分为两部分?

a = "('a','b','c'),('d','e','f')" 

我想重新使用拆分它,这样我会得到2个元素,包含"('a','b','c')"('d','e','f')的数组。我想:

matches = re.split("(?:\)),(?:\()",a) 

但是这给我的结果:

'(2,3,4' 
'1,6,7)' 

我可以分析它的,每个字符,但如果一个正则表达式的解决方案是可能的,我会更喜欢它。

回答

3

您需要分割前面有)后跟一个(的逗号。但括号本身不应该成为分歧点的一部分。对于那些需要使用正向前查找和正面看断言背后为:

matches = re.split("(?<=\)),(?=\()",a) 

See it

+0

我从这个正则表达式出现语法错误。 – Geo

+0

@Tempus:现在怎么样? – codaddict

+0

现在没关系,谢谢! – Geo

2

试试这个:

from ast import literal_eval 
a = "('a','b','c'),('d','e','f')" 
x, y = literal_eval(a) 

在此之后,x('a', 'b', 'c')可与str(x)被stringized ,或者,如果有空间的话,

"(%s)" % ",".join(repr(z) for z in x) 
2

split这里是错误的工具。你想findall

import re 
a = "('a','b','c'),('d','e','f')" 
matches = re.findall("\([^)]*\)", a) 

或几乎等同,

matches = re.findall("\(.*?\)", a) 
+0

+1就像这样,简单得多,但这会更好:''re.findall(“\([^()] * \)”,s)':你想要任何不是'或')'。 – juliomalegria

+0

好吧,另一个开放的支撑并不会真的伤害任何 - 你只需要禁止关闭的那个,所以贪婪的星星知道在哪里停止。开括号不会造成任何问题。可以肯定的是,如果在字符串中有任何带引号的右括号,这种方法就会失效,但只用正则表达式而不是解析器就不能正确处理。它也不检查括号内是否有逗号。 – Amadan

+0

你的回答对于OP的问题是100%准确的。我的评论只是一种改进,可以让它在其他情况下工作。例如,如果他有:'s ='((1,2,3),(4,5,6))',你的解决方案会给我们:'['((1,2,3)', '(4,5,6)']'(而不是额外的开口大括号),而在我修改的情况下,'matches'将是:'['(1,2,3)','(4,5,6) ']' – juliomalegria

相关问题