Найти предложение, содержащее определенное выражение с регулярным выражением - PullRequest
0 голосов
/ 23 ноября 2018

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

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

Если у меня есть текст: 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 ]

0 голосов
/ 23 ноября 2018

Токенизируйте текст в предложения с помощью 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.

0 голосов
/ 23 ноября 2018

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

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.']

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

0 голосов
/ 23 ноября 2018

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

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

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

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