Sé que esta pregunta se ha hecho antes, pero hoy encontré el siguiente código en SO:

import re   

def findIfWordMatch(w):
    return re.compile(r'\b({0})\b'.format(w), flags=re.IGNORECASE).search

Por ejemplo, si uso las siguientes cadenas, la función devuelve un objeto de coincidencia si se encuentra text1 en text2 (de lo contrario, la función devuelve None):

text1 = 'DIBUJO'
text2 = 'DIBUJO B308'

Para saber si text1 está en text2 hago lo siguiente:

if(findIfWordMatch(text1)(text2) is not None):  
    #doSomething()

Y ha estado funcionando bien hasta que usé estas variables:

text1 = 'INT.EST.C.S.'
text2 = 'INT.EST.C.S. B308'

Estoy casi seguro de que no tiene nada que ver con los puntos porque tengo otras variables con una estructura similar y funciona muy bien, así que ...

Me gustaría saber por qué sucede esto u otra forma de averiguar si una cadena está dentro de otra.

Gracias en el consejo

3
John Ackerman 26 feb. 2018 a las 07:13

3 respuestas

La mejor respuesta
'INT.EST.C.S. B308'
            ^^

Juntos, el punto y el espacio '. ', en expresiones regulares equivalentes a \W\W, no se consideran parte del límite de la palabra \b (^\w|\w$|\W\w|\w\W). Usa el bloqueo negativo (?<!)(?!).

Regex : (?<!\S){0}(?!\S)

6
Srdjan M. 26 feb. 2018 a las 12:20

Intenta esto en su lugar.

text1 = 'INT.EST.C.S.'
text2 = 'INT.EST.C.S. B308'

if text1 in text2:
  print("yes!")
1
Jony Karki 26 feb. 2018 a las 04:18

El punto '.' se usa para unir cualquier carácter. Entonces su patrón coincide más de lo que debería.

Puedes formatear tu patrón correctamente escapando de los puntos.

text1 = r'INT\.EST\.C\.S\.'

O como este es un patrón simple, puede usar in para verificar si text1 está contenido en text2

if text1 in text2:  
    #doSomething()
0
Olivier Melançon 26 feb. 2018 a las 04:20