A ordem das alternativas na regex é importante?

2

Eu quero extrair letras e números de uma string.

Eu tentei isso:

>>> re.findall(r'[a-z]|\d*','a11b4')
['a', '11', 'b', '4', '']
>>> re.findall(r'\d*|[a-z]','a11b4')
['', '11', '', '4', '']

Por que mudar a ordem das alternativas na regex, altera a saída?

    
por arturMD 31.03.2017 / 22:47

1 resposta

2

É porque você está usando \d com * .

Quando você tem [a-z]|\d* , ele primeiro tentará corresponder a a-z . Caso contrário, tentará corresponder a 0 ou mais repetições de um dígito. No seu exemplo, ele corresponderá a a primeiro.

No entanto, ao contrário, ele tentará primeiro corresponder a 0 ou mais repetições de um dígito. Bem, a é 0 repetições de um dígito, então ele se qualifica como 'correspondência'. Ele não tentará avaliar a expressão [a-z] , já que ela está qualificada para 0 repetições.

Para usar este padrão adequadamente (especialmente se tiver para ser uma letra ou pelo menos um dígito), você poderia usar:

[a-z]|\d+ ou \d+|[a-z]

Isso procuraria por 1 ou mais repetições de um dígito, não corresponderia em a e, em seguida, avaliaria [a-z] , resultando na resposta esperada.

    
por 31.03.2017 / 22:59

Tags