El siguiente código imprime espacios en blanco y no '11' y no puedo entender por qué. Reemplazar [0-9]* con [0-9]{1,2} imprime '11'. ¿Alguien puede ayudar?

import re
test_string = 'cake_11xlfslijg'
pattern = '.*(?P<order>[0-9]*)'
result = re.compile(pattern).search(test_string)
if result:
    print 'result'
    print result.group('order')
else:
    print result
2
chris 20 jul. 2011 a las 18:34

4 respuestas

La mejor respuesta

Prueba [0-9]+. El * se traduce como "cero o más" , y hay cero o más dígitos justo al comienzo de su cadena.

7
Tomalak 20 jul. 2011 a las 14:38

Tu expresión regular debería ser esta

pattern = '(?P<order>[0-9]+)'
  1. Se eliminó el primer. * Ya que hará una coincidencia codiciosa de toda la cadena.
  2. Hecho [0-9] + ya que solo coincidirá con los dígitos, aunque al menos uno esté presente; de lo contrario, devolverá Ninguno.
3
Senthil Kumaran 20 jul. 2011 a las 14:42

Porque * significa: cualquier número de repeticiones, en tu expresión regular .* coincidirá con toda la cadena, porque . significa cualquier carácter, es decir, incluye [0-9]

1
Kirill Polishchuk 20 jul. 2011 a las 14:38

Un patrón de expresiones regulares debe tener un mínimo de anclajes.

Con '. ' y '[0-9] ', solo hay símbolos opcionales.

Tratar

import re

for test_string in ( 'cake_11xlfslijg',
                     'cake_uuxlfslijg'):
    pattern = '.*?(?P<order>[0-9]+)'
    result = re.compile(pattern).search(test_string)
    print test_string
    print 'result: ',repr(result.group('order')) if result else result
    print

Da

cake_11xlfslijg
result:  '11'

cake_uuxlfslijg
result:  None
0
eyquem 20 jul. 2011 a las 14:51