假设:
x = '1 (2,3), 4 (5)'
我将如何获得:
y = [(1,2),(1,3),(4,5)] ?
谢谢。
答案 0 :(得分:1)
>>> x = '1 (2,3), 4 (5)'
>>> gp = re.compile('\d+\s*\([\d,]+\)(?=,?)')
>>> # digit, whitespace, (, digits or commas, ), maybe a comma
>>> for token in gp.findall(x):
... token = token.split("(", 1)
... left, right = int(token[0]), map(int, token[1][:-1].split(","))
... for elt in right:
... print((left, elt))
...
(1, 2)
(1, 3)
(4, 5)
警告:由于基于正则表达式的解析,这很脆弱。 (例如,它假设您的所有数字都是整数。)如果您的输入比我假设的更灵活,您可能希望考虑推广正则表达式或移动到正确的解析库。
一个巧妙的用途是将它放在一个函数中并将print
更改为yield
,以使其成为生成器。
答案 1 :(得分:1)
不确定这是否有帮助,但它对我有用:
x = '1 (2,3,9), 4 (5), 7'
output = []
for y in x.split(')'):
if not y:
continue
data = y.split('(')
right = int(data[0].strip(' ,'))
if len(data) == 2:
output.extend([(right, int(c)) for c in data[1].split(',')])
else:
output.append((right, ))
print output
>>> [(1, 2), (1, 3), (1, 9), (4, 5), (7,)]