python - delimiters - El código del producto se parece a abcd2343, lo que se divide por letras y números
python split string parameters (4)
Tengo una lista de códigos de productos en un archivo de texto, en cada uno de los cuales está el código del producto que se ve así:
abcd2343 abw34324 abc3243-23A
Así que es letras seguidas de números y otros caracteres.
Quiero dividir en la primera aparición de un número.
Para particionar en el primer dígito
parts = re.split(''(/d.*)'',''abcd2343'') # => [''abcd'', ''2343'', '''']
parts = re.split(''(/d.*)'',''abc3243-23A'') # => [''abc'', ''3243-23A'', '''']
Así que las dos partes son siempre partes [0] y partes [1].
Por supuesto, puede aplicar esto a múltiples códigos:
>>> s = "abcd2343 abw34324 abc3243-23A"
>>> results = [re.split(''(/d.*)'', pcode) for pcode in s.split('' '')]
>>> results
[[''abcd'', ''2343'', ''''], [''abw'', ''34324'', ''''], [''abc'', ''3243-23A'', '''']]
Si cada código está en una línea individual, en lugar de s.split( )
use s.splitlines()
.
def firstIntIndex(string):
result = -1
for k in range(0, len(string)):
if (bool(re.match(''/d'', string[k]))):
result = k
break
return result
import re
m = re.match(r"(?P<letters>[a-zA-Z]+)(?P<the_rest>.+)$",input)
m.group(''letters'')
m.group(''the_rest'')
Esto cubre su caso de esquina de abc3243-23A y generará abc
para el grupo de letras y 3243-23A para the_rest
Como dijo que todos están en líneas individuales, obviamente necesitará poner una línea a la vez en la input
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+
coincide con 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 no dígitos.
Consulte los documentos para obtener más información sobre la sintaxis de expresiones regulares de Python.
re.split(pat, s)
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 que re.split
con pat
también. Por ejemplo, compara:
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
En contraste, re.findall(pat, s)
devuelve solo las partes de s
que coinciden con pat
:
In [115]: re.findall(''/d+'', s)
Out[115]: [''2343'', ''34324'', ''3243'', ''23'']
Por lo tanto, si s
termina con un dígito, podría evitar terminar con una cadena vacía utilizando re.findall(''/d+|/D+'', s)
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'']