Я знаю, что этот вопрос задавался ранее, но ранее сегодня я нашел следующий код в SO:

import re   

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

Например, если я использую следующие строки, функция возвращает объект соответствия, если text1 найден в text2 (в противном случае функция возвращает None):

text1 = 'DIBUJO'
text2 = 'DIBUJO B308'

Чтобы узнать, есть ли text1 в text2, я делаю следующее:

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

И это работало хорошо, пока я не использовал эти переменные:

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

Я почти уверен, что это не имеет ничего общего с точками, потому что у меня есть другие переменные с похожей структурой, и в работе просто отлично, так что ..

Я хотел бы знать, почему это происходит, или другой способ узнать, находится ли строка внутри другой.

Спасибо за совет

3
John Ackerman 26 Фев 2018 в 07:13

3 ответа

Лучший ответ
'INT.EST.C.S. B308'
            ^^

Точка и пробел '. ' вместе в регулярном выражении, эквивалентном \W\W, не считаются частью границы слова \b (^\w|\w$|\W\w|\w\W). Используйте отрицательный локатор (?<!)(?!).

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

6
Srdjan M. 26 Фев 2018 в 12:20

Попробуйте это вместо этого.

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

if text1 in text2:
  print("yes!")
1
Jony Karki 26 Фев 2018 в 04:18

Точка '.' используется для соответствия любому символу. Таким образом, ваш шаблон соответствует больше, чем должен.

Вы можете правильно отформатировать ваш шаблон, избегая точек.

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

Или, поскольку это простой шаблон, вы можете использовать in, чтобы проверить, содержится ли text1 в text2

if text1 in text2:  
    #doSomething()
0
Olivier Melançon 26 Фев 2018 в 04:20