2010-07-27 8 views

Respuesta

26
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'] 
+0

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

+1

IIUC, podría usar 're.findall ('(\ d + | \ D +)', 'abcd2343 abw34324 abc3243-23')', que devuelve '['abcd', '2343', 'abw', '34324' , 'abc', '3243', '-', '23'] '. – unutbu

0
def firstIntIndex(string): 
    result = -1 
    for k in range(0, len(string)): 
     if (bool(re.match('\d', string[k]))): 
      result = k 
      break 
    return result 
1
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 esquina de abc3243-23A y dará salida a abc para el grupo de letras y 3243-23A para the_rest

ya que dijo que están todos en líneas individuales que usted, obviamente, tiene que poner una línea a la vez en input

1

a la partición 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, se 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 se encuentra en una línea individual a continuación, en lugar de s.split() uso s.splitlines().

Cuestiones relacionadas