Как получить все совпадения, используя str.contains в регулярном выражении python? - PullRequest
1 голос
/ 07 апреля 2020

У меня есть фрейм данных, в котором мне нужно найти все возможные строки совпадений, которые соответствуют terms. Мой код

texts = ['foo abc', 'foobar xyz', 'xyz baz32', 'baz 45','fooz','bazzar','foo baz']
terms = ['foo','baz','foo baz']
# create df
df = pd.DataFrame({'Match_text': texts})
#cretae pattern 
pat = r'\b(?:{})\b'.format('|'.join(terms))
# use str.contains to find matchs
df = df[df['Match_text'].str.contains(pat)]

#create pattern
p = re.compile(pat)

#search for pattern in the column
results = [p.findall(text) for text in df.Match_text.tolist()]
df['results'] = results

Вывод

Match_text  results
0   foo abc     [foo]
3   baz 45      [baz]
6   foo baz     [foo, baz]

, в котором foo baz также соответствует строке 6 наряду с foo и baz. Мне нужно получить строки для всех совпадений, которые находятся в terms

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Более длинные альтернативы должны предшествовать более коротким, поэтому вам нужно отсортировать ключевые слова по длине в порядке убывания:

pat = r'\b(?:{})\b'.format('|'.join(sorted(terms,key=len,reverse=True)))

Результатом будет шаблон \b(?:foo baz|foo|baz)\b. Сначала он попытается сопоставить foo baz, затем foo, затем baz. Если найдено foo baz, совпадение возвращается, то следующее совпадение ищется с конца совпадения, поэтому вы не сопоставите foo или baz, найденное с предыдущим совпадением.

Подробнее об этом см. В " Помните, что движок Regex стремится " .

0 голосов
/ 07 апреля 2020

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

#create pattern
p = re.compile(pat)

#search for pattern in the column
results = [p.findall(text) for text in df.Match_text.tolist()]

Попробуйте использовать простой поиск терминов в тексте, как этот.

#search for each term in the column
results = [[term for term in terms if term in text] for text in df.Match_text.tolist()]

Вывод для выше выглядит так:

    Match_text  results
0   foo abc [foo]
3   baz 45  [baz]
6   foo baz [foo, baz, foo baz]

ПРИМЕЧАНИЕ. С этим методом связана временная сложность.

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