Захватить строку между двумя словами, но только 1 раз - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть строка вроде:

 text = "Why do Humans need to eat food? Humans eat food to survive."

Я хочу захватить все между Human и food, но только 1-й раз.

Ожидаемый результат

Humans need to eat food

My Regex:

p =r'(\bHumans?\b.*?\bFoods?\b)'

Код Python:

re.findall(p, text, re.I|re.M|re.DOTALL)

Код правильно фиксирует строкумежду человеком и едой, но не останавливается при первом захвате.

Исследования :

Я читал, что для того, чтобы сделать его не жадным, мне нужно положить ? но я не могу понять, где я должен держать это, чтобы сделать его не жадным.Все остальные перестановки и комбинации, которые я пробовал, я не могу остановить их на 1-м матче.

Обновление

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

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

Для нахождения только первого совпадения лучше всего ответ Тото, но, как вы сказали, вам нужно использовать только findall, вы можете просто добавить .* в конце вашего регулярного выражения, чтобы соответствовать оставшемуся тексту, что не приведет клюбые совпадения далее.

(\bHumans?\b.*?\bFoods?\b).*
                          ^^ This eats remaining part of your text due to which there won't be any further matches.

Демо

Образцы кодов Python,

import re

text = "Why do Humans need to eat food? Humans eat food to survive."
p =r'(\bHumans?\b.*?\bFoods?\b).*'
print(re.findall(p, text, re.I|re.M|re.DOTALL))

Отпечатки,

['Humans need to eat food']
0 голосов
/ 01 февраля 2019

Попробуйте это:

>>> import re
>>> text = "Why do Humans need to eat food? Humans eat food to survive."
>>> re.search(r'Humans.*?food', text).group() # you want the all powerful non-greedy '?' :)
'Humans need to eat food'
0 голосов
/ 01 февраля 2019

Используйте search вместо findall:

import re
text = "Why do Humans need to eat food? Humans eat food to survive."
p =r'(\bHumans?\b.*?\bFoods?\b)'
res = re.search(p, text, re.I|re.M|re.DOTALL)
print(res.groups())

Вывод:

('Humans need to eat food',)

Или добавьте .* в конце регулярного выражения:

import re
text = "Why do Humans need to eat food? Humans eat food to survive."
p =r'(\bHumans?\b.*?\bFoods?\b).*'
#                      here ___^^
res = re.findall(p, text, re.I|re.M|re.DOTALL)
print(res)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...