Найти предложение, содержащее определенное выражение с регулярным выражением

Это для школьного проекта по программированию, и я должен использовать только реимпорт.

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

Если у меня есть текст: This is a text. I dont want for the result to stop in the number 990.576, I want to extract the phrase with this expression. Its not working.

search = re.findall(r"([^.]*?"+expression+"[^.]*\.", txt)

В результате я получаю ['576, I want to extract the phrase with this expression',]

Результат, который я хочу, это ['I dont want for the result to stop in the number 990.576, I want to extract the phrase with this expression.']

Я все еще начинающий в этом, любая помощь?

3 ответа

Если я не ошибаюсь, вы хотите разделить предложения. Для этой цели лучшим регулярным выражением является следующее:

sentences = re.split(r' *[\.\?!][\'"\)\]]* *', txt)

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

txt = re.sub(r'(\d*)\.(\d+)', r'\1,\2', txt)

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

sentences = re.split(r'(?<!\w\.\w.)(?<![A-Z][a-z]\.)(?<=\.|\?)\s', text)

matching = [s for s in sentences if "I want to extract the phrase with this expression" in s]

print(matching)

#Result:
# ['I dont want for the result to stop in the number 990.576, I want to extract the phrase with this expression.']

Надеюсь, поможет!

Токенизируйте текст в предложения с помощью NLTK, а затем используйте поиск по всему слову или регулярную проверку подстроки.

Пример с поиском по всему слову:

import nltk, re
text = "This is a text. I dont want for the result to stop in the number 990.576, I want to extract the phrase with this expression. Its not working."
sentences = nltk.sent_tokenize(text)
word = "expression"
print([sent for sent in sentences if re.search(r'\b{}\b'.format(word), sent)])
# => ['I dont want for the result to stop in the number 990.576, I want to extract the phrase with this expression.']

Если вам не нужно искать слово целиком, замените if re.search(r'\b{}\b'.format(word), sent) с if word in sent,

Другие вопросы по тегам