Я ищу регулярное выражение (Python), которое соответствует подстроке определенного запроса, пока не появится другая подстрока, если это произойдет. Чтобы лучше понять это, приведу несколько примеров:
# Query 1
title:chicago bullie
В каждом запросе моя цель — захватить title и строки, которые следуют за ним. Я начал с регулярного выражения title:.*, которое фиксирует весь запрос title:chicago bullie. Запросы усложняются за счет включения других элементов:
# Query 2
title:chicago bullie author:adam
В этом случае запрос title:.* больше не работает, потому что моя цель — захватить только title:chicago bullie и исключить другой элемент author:adam. Другими словами, я хочу захватить ключевое слово title, за которым следует строка или несколько строк, пока не закончится запрос или не появится другое ключевое слово (например, автор, год и т. д.). Обратите внимание, что за ключевыми словами всегда следует : и строка или несколько строк. Запросы также могут включать ключевое слово AND для обозначения последнего ключевого слова:
# Query 3
title:chicago bullie AND author:adam
Моя мысль заключалась в том, чтобы использовать отрицательный просмотр вперед для захвата подстроки title:<string(s)> до тех пор, пока строка не закончится или не появится другое ключевое слово (за которым следует : и другие строки). Я придумал регулярное выражение title:.* (?!:), но я не уверен, что это лучший способ добиться этого. Это работает для всех примеров, кроме тех, которые содержат ключевое слово AND.
# Query 3
type:action title:chicago bullie one author:adam
Captured group: title:chicago bullie
# Query 4
type:action title:chicago bullie one AND author:adam
Captured group: title:chicago bullie AND
Хотя регулярное выражение работает для запросов без ключевых слов AND, я все же думаю, что решение не идеально для таких случаев. Обратите внимание, что есть пробел, разделяющий title:.* и отрицательный просмотр вперед (?!:).
Есть ли более чистый способ охватить все перечисленные требования?






Как насчет:
import re
PATT = r'.*?(title:.*?)(\w+:|AND|$)'
MYRE = re.compile(PATT, re.M)
ans = MYRE.findall(c)
ans = [x[0] for x in ans]
print(ans)
Вы можете использовать шаблон с положительным прогнозом:
.*?(title:.*?)(?=AND|\w+:|$)
который при добавлении в код выглядит так:
def find_match(query):
return re.match(r'.*?(title:.*?)(?=AND|\w+:|$)', query).group(1).strip()
и при запуске:
>>> find_match('title:chicago bullie')
title:chicago bullie
>>> find_match('title:chicago bullie author:adam')
title:chicago bullie
>>> find_match('title:chicago bullie AND author:adam')
title:chicago bullie
@Khabz, мое недоразумение. Обновлено.
Обратите внимание, что это соответствует дополнительному пробелу и соответствует только title в начале строки.
@blhsing, нужно исправить это сейчас.
Вы можете использовать положительный шаблон просмотра вперед с чередованием слова, за которым следует двоеточие и, возможно, которому предшествует AND, и конец строки:
re.search(r'\btitle:.*?(?=\s*(?:AND\s+)?\w+:|$)', s).group()
так что учитывая s = 'type:action title:chicago bullie one AND author:adam', это возвращает:
title:chicago bullie one
authorбыл просто примером ключевого слова, есть несколько других, которые можно рассмотреть. В этом задании достаточно просто рассмотреть ключевое слово ЛЮБОЕ слово, за которым следует:. В этом случаеauthorследует заменить любым словом.