multiple delimiters array python split

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'']