Как найти подходящие слова с помощью регулярных выражений? - PullRequest
2 голосов
/ 29 апреля 2020

У меня есть строки в текстовом файле с более чем 2000 строками, например:

cool.add.come.ADD_COPY
add.cool.warm.ADD_IN
warm.cool.warm.MINUS
cool.add.go.MINUS_COPY

У меня есть список из более чем 200 подходящих слов, например:

store=['ADD_COPY','add.cool.warm.ADD_IN', 'warm.cool.warm.MINUS', 'MINUS_COPY']

I Я использую регулярное выражение в коде

def all(store, file):
    lst=[]
    for match in re.finditer(r'[\w.]+', file):
        words = match.group()
            if words in store:
                lst.append(words) 
    return lst 

Затем я проверяю в al oop требование.

Вывод получаю:

add.cool.warm.ADD_IN
warm.cool.warm.MINUS

Если Я меняю идентификаторы на \w+, тогда получаю только:

ADD_COPY
MINUS_COPY

Требуемый вывод:

add.cool.warm.ADD_IN
warm.cool.warm.MINUS   
ADD_COPY
MINUS_COPY

1 Ответ

3 голосов
/ 29 апреля 2020

Похоже, вы хотите получить результаты, используя простое понимание списка:

results = set([item for item in store if item in text])

Если вам нужно регулярное выражение (если вы планируете совпадать только с целыми словами или только с вашими store элементами) в определенных c контекстах), вы можете получить совпадения, используя

import re
text="""cool.add.come.ADD_COPY
add.cool.warm.ADD_IN
warm.cool.warm.MINUS
cool.add.go.MINUS_COPY"""

store=['ADD_COPY','add.cool.warm.ADD_IN', 'warm.cool.warm.MINUS', 'MINUS_COPY']
rx="|".join(sorted(map(re.escape, store), key=len, reverse=True))
print(re.findall(rx, text))

Регулярное выражение будет выглядеть так:

add\.cool\.warm\.ADD_IN|warm\.cool\.warm\.MINUS|MINUS_COPY|ADD_COPY

См. regex demo , в основном, все ваши store предметы с экранированными специальными символами и отсортированы по длине в порядке убывания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...