Найти предложение, содержащее определенное выражение с регулярным выражением
Это для школьного проекта по программированию, и я должен использовать только реимпорт.
Я пытаюсь найти все предложения в текстовом файле, содержащем определенное выражение, определенное параметром, и извлечь их в список. Поиск других сообщений привел меня на полпути к поиску точек, начинающих и заканчивающих предложение, но если там есть число с точкой, это портит результат.
Если у меня есть текст: 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
,