In [32]: import re
In [33]: s='abcd2343 abw34324 abc3243-23A'
In [34]: re.split('(\d+)',s)
Out[34]: ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A']
O, si desea dividir en la primera aparición de un dígito:
In [43]: re.findall('\d*\D+',s)
Out[43]: ['abcd', '2343 abw', '34324 abc', '3243-', '23A']
\d+
partidos-1 o más dígitos.
\d*\D+
coincide con 0 o más dígitos seguidos de 1 o más dígitos sin dígitos.
\d+|\D+
coincide con 1 o más dígitos o 1 o más dígitos sin dígitos.
Consultar the docs para más información sobre la sintaxis de expresiones regulares de Python.
re.split(pat, s)
se dividir la cadena s
usando pat
como delimitador. Si pat
comienza y termina con paréntesis (para ser un "grupo de captura"), entonces re.split
devolverá las subcadenas coincidentes con pat
también. Por ejemplo, comparar:
In [113]: re.split('\d+', s)
Out[113]: ['abcd', ' abw', ' abc', '-', 'A'] # <-- just the non-matching parts
In [114]: re.split('(\d+)', s)
Out[114]: ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A'] # <-- both the non-matching parts and the captured groups
Por el contrario, re.findall(pat, s)
devuelve sólo las partes de s
que coinciden pat
:
In [115]: re.findall('\d+', s)
Out[115]: ['2343', '34324', '3243', '23']
Por lo tanto, si s
termina con un dígito, se podría evitar terminar con una cadena vacía mediante el uso de re.findall('\d+|\D+', s)
en lugar de re.split('(\d+)', s)
:
In [118]: s='abcd2343 abw34324 abc3243-23A 123'
In [119]: re.split('(\d+)', s)
Out[119]: ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A ', '123', '']
In [120]: re.findall('\d+|\D+', s)
Out[120]: ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A ', '123']
Si usa '(\ d +)', y un dígito es el último carácter de la cadena, la última entrada en la lista será una cadena vacía. ¿Cómo evitamos eso? – user124384
IIUC, podría usar 're.findall ('(\ d + | \ D +)', 'abcd2343 abw34324 abc3243-23')', que devuelve '['abcd', '2343', 'abw', '34324' , 'abc', '3243', '-', '23'] '. – unutbu