Me he enfrentado con el siguiente problema:

change = "1,23 2,54 1,85 "
results = re.findall(r"((\d+),(\d+) )+((\d+),(\d+) )+", change)
print(results)

Los resultados son:

('2,54 ', '2', '54', '1,85 ', '1', '85')

Pero quiero algo como esto:

('1,23 ', '1', '23', '2,54 ', '2', '54', '1,85 ', '1', '85')

Desafortunadamente no he encontrado ninguna solución.

-2
Denis Kotov 1 abr. 2017 a las 12:34

2 respuestas

La mejor respuesta

Su repetición del grupo regex es redundante. Simplemente debe usar 1 y simplemente hacer findall. He usado itertools.chain pero también puedes lograrlo con una simple comprensión de la lista.

change = "1,23 2,54 1,85 "
results = re.findall(r"((\d+),(\d+) )", change)
print(results)
# [('1,23 ', '1', '23'), ('2,54 ', '2', '54'), ('1,85 ', '1', '85')]
from itertools import chain
print(list(chain(*results)))
# ['1,23 ', '1', '23', '2,54 ', '2', '54', '1,85 ', '1', '85']
# simple list comprehension
print([single for group in results for single in group])
# ['1,23 ', '1', '23', '2,54 ', '2', '54', '1,85 ', '1', '85']
2
shad0w_wa1k3r 1 abr. 2017 a las 09:49

Use el siguiente enfoque:

change = "1,23 2,54 1,85 "
results = [n for t in re.findall(r"((\d+),(\d+))", change) for n in t]
print(results)

La salida:

['1,23', '1', '23', '2,54', '2', '54', '1,85', '1', '85']
0
RomanPerekhrest 1 abr. 2017 a las 09:42