2009-10-29 18 views
11

Estoy tratando de usar una expresión regular de Python para encontrar una expresión matemática en una cadena. El problema es que la barra inclinada parece hacer algo inesperado. Pensé que [\w\d\s+-/*]* funcionaría para encontrar expresiones matemáticas, pero también encuentra comas por algún motivo. Un poco de experimentación revela que las barras diagonales son las culpables. Por ejemplo:Barra diagonal hacia adelante en una expresión regenta de Python

>>> import re 
>>> re.sub(r'[/]*', 'a', 'bcd') 
'abacada' 

barras inclinadas hacia adelante parecer partido entre caracteres (incluso cuando se encuentra en una clase de caracteres, aunque sólo cuando el asterisco está presente). Las barras posteriores no escapan de ellas. Estuve cazando durante un tiempo y no encontré documentación sobre eso. ¿Alguna sugerencia?

Respuesta

19

Mire here for documentation en el módulo re de Python.

creo que no es el /, sino más bien la - en su primera clase de caracteres: [+-/] partidos +, / y cualquier valor ASCII entre, que suceden a incluir la coma.

Tal vez esta indirecta de la ayuda docs:

Si desea incluir a ']' o '-' dentro de un conjunto, precedido de una barra invertida, o colocarlo como el primer carácter.

+0

RTFM no es una respuesta aceptable. Las otras respuestas son correctas. –

7

Lo dice para reemplazar cero o más barras inclinadas con 'a'. Por lo tanto, reemplaza cada "sin carácter" con 'a'. :)

Probablemente quiso decir [/]+, es decir, una o más barras diagonales.

EDITAR: Lea Ber's answer para encontrar una solución al problema original. No leí toda la pregunta con cuidado.

2

r '[/] *' significa "Coincide con 0 o más barras diagonales hacia adelante". Hay exactamente 0 barras inclinadas hacia adelante entre 'b' & 'c' y entre 'c' & 'd'. Por lo tanto, esas coincidencias se reemplazan por 'a'.

2

El * coincide con su argumento cero o más veces, y por lo tanto coincide con la cadena vacía. La cadena vacía es (lógicamente) entre dos caracteres consecutivos. Por lo tanto

>>> import re 
>>> re.sub(r'x*', 'a', 'bcd') 
'abacada' 

En cuanto a la barra diagonal, no recibe ningún tratamiento especial:

>>> re.sub(r'/', 'a', 'b/c/d') 
'bacad' 

El documentation describe la sintaxis de las expresiones regulares en Python. Como puede ver, la barra diagonal no tiene una función especial.

La razón por la que también encuentra [\w\d\s+-/*]* de coma, se debe a que dentro de los paréntesis cuadrados del tablero - denota un rango. En este caso, no desea todos los caracteres entre + y /, sino a los caracteres literales +, - y /. Así que escriba el guión como el último carácter: [\w\d\s+/*-]*. Eso debería arreglarlo.

Cuestiones relacionadas