想象一下:如何使用正则表达式将该字符串分为两部分?
a = "('a','b','c'),('d','e','f')"
我想重新使用拆分它,这样我会得到2个元素,包含"('a','b','c')"
和('d','e','f')
的数组。我想:
matches = re.split("(?:\)),(?:\()",a)
但是这给我的结果:
'(2,3,4'
'1,6,7)'
我可以分析它的,每个字符,但如果一个正则表达式的解决方案是可能的,我会更喜欢它。
想象一下:如何使用正则表达式将该字符串分为两部分?
a = "('a','b','c'),('d','e','f')"
我想重新使用拆分它,这样我会得到2个元素,包含"('a','b','c')"
和('d','e','f')
的数组。我想:
matches = re.split("(?:\)),(?:\()",a)
但是这给我的结果:
'(2,3,4'
'1,6,7)'
我可以分析它的,每个字符,但如果一个正则表达式的解决方案是可能的,我会更喜欢它。
您需要分割前面有)
后跟一个(
的逗号。但括号本身不应该成为分歧点的一部分。对于那些需要使用正向前查找和正面看断言背后为:
matches = re.split("(?<=\)),(?=\()",a)
试试这个:
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)
split
这里是错误的工具。你想findall
:
import re
a = "('a','b','c'),('d','e','f')"
matches = re.findall("\([^)]*\)", a)
或几乎等同,
matches = re.findall("\(.*?\)", a)
+1就像这样,简单得多,但这会更好:''re.findall(“\([^()] * \)”,s)':你想要任何不是'或')'。 – juliomalegria
好吧,另一个开放的支撑并不会真的伤害任何 - 你只需要禁止关闭的那个,所以贪婪的星星知道在哪里停止。开括号不会造成任何问题。可以肯定的是,如果在字符串中有任何带引号的右括号,这种方法就会失效,但只用正则表达式而不是解析器就不能正确处理。它也不检查括号内是否有逗号。 – Amadan
你的回答对于OP的问题是100%准确的。我的评论只是一种改进,可以让它在其他情况下工作。例如,如果他有:'s ='((1,2,3),(4,5,6))',你的解决方案会给我们:'['((1,2,3)', '(4,5,6)']'(而不是额外的开口大括号),而在我修改的情况下,'matches'将是:'['(1,2,3)','(4,5,6) ']' – juliomalegria
我从这个正则表达式出现语法错误。 – Geo
@Tempus:现在怎么样? – codaddict
现在没关系,谢谢! – Geo