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 diagonal parece hacer algo inesperado. Pensé que [\w\d\s+-/*]* funcionaría para encontrar expresiones matemáticas, pero también encuentra comas por alguna razón. Un poco de experimentación revela que los cortes diagonales son los culpables. Por ejemplo:

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

Aparentemente, las barras inclinadas coinciden entre los caracteres (incluso cuando está en una clase de caracteres, aunque solo cuando el asterisco está presente). Las barras diagonales traseras no se les escapan. He buscado durante un tiempo y no he encontrado ninguna documentación al respecto. Cualquier puntero?

20
exupero 29 oct. 2009 a las 16:33

4 respuestas

La mejor respuesta

Busque aquí para obtener documentación sobre el módulo re de Python.

Creo que no es el /, sino el - en su primera clase de caracteres: [+-/] coincide con +, / y cualquier valor ASCII entre los cuales Resulta que incluye la coma.

Tal vez esta pista de la ayuda de los documentos:

Si desea incluir un ']' o un '-' dentro de un conjunto, preceda con una barra diagonal inversa o colóquelo como el primer carácter.

23
dantiston 25 nov. 2017 a las 05:49

* coincide con su argumento cero o más veces, y por lo tanto coincide con la cadena vacía. La cadena vacía está (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'

La documentación 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 [\w\d\s+-/*]* también encuentra comas es porque dentro de corchetes el guión - denota un rango . En este caso, no desea todos los caracteres entre + y /, sino los caracteres literales +, - y /. Por lo tanto, escriba el guión como el último carácter: [\w\d\s+/*-]*. Eso debería arreglarlo.

2
Stephan202 29 oct. 2009 a las 13:54

R '[/] *' significa "Hacer coincidir 0 o más barras diagonales". Hay exactamente 0 barras diagonales entre 'b' y 'c' y entre 'c' y 'd'. Por lo tanto, esas coincidencias se reemplazan con 'a'.

2
jamessan 29 oct. 2009 a las 13:38

Está diciendo que reemplace cero o más barras inclinadas con 'a'. Por lo tanto, reemplaza cada "sin carácter" con 'a'. :)

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

EDITAR: Lea la respuesta de Ber para una solución al problema original. No leí toda la pregunta con suficiente cuidado.

8
Community 23 may. 2017 a las 12:00