2012-03-27 25 views
18

Digamos que tiene una cadena¿Cómo usar la expresión regular con caracteres opcionales en python?

"3434.35353" 

y otra cadena

"3593" 

¿Cómo hago una sola expresión regular que es capaz de igualar tanto sin tener que establecer el patrón a otra cosa si el otro falla? Sé que \d+ coincidiría con el 3593, pero no haría nada por el 3434.35353, pero (\d+\.\d+) solo coincidiría con el decimal y no devolverá coincidencias encontradas para el 3593.

espero m.group(1) para volver:

"3434.35353" 

o

"3593" 

Respuesta

32

se puede poner un ? después de un grupo de caracteres para que sea opcional.

Desea un punto seguido de cualquier cantidad de dígitos \.\d+, agrupados juntos (\.\d+), opcionalmente (\.\d+)?. Palo que en su patrón:

import re 
print re.match("(\d+(\.\d+)?)", "3434.35353").group(1) 
3434.35353 
print re.match("(\d+(\.\d+)?)", "3434").group(1) 
3434 
1

uso del "uno o cero" cuantificador, ?. Su expresión regular se convierte en: (\d+(\.\d+)?).

Consulte el Capítulo 8 de TextWrangler manual para obtener más detalles sobre los diferentes cuantificadores disponibles y cómo usarlos.

3

Esta expresión regular debería funcionar:

\d+(\.\d+)? 

que coincide con uno o más dígitos (\d+) opcionalmente seguido por un punto y una o más dígitos ((\.\d+)?).

0

Lectura en la biblioteca Python RegEx. El enlace responde su pregunta y explica por qué.

Sin embargo, para que coincida con un dígito seguido por más dígitos con un decimal opcional, puede utilizar

re.compile("(\d+(\.\d+)?)") 

En este ejemplo, el? después del grupo de captura .\d+ especifica que esta parte es opcional.

Example

Cuestiones relacionadas