Регулярное выражение для подстроки запроса

Я ищу регулярное выражение (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:.* и отрицательный просмотр вперед (?!:).

Есть ли более чистый способ охватить все перечисленные требования?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
62
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Как насчет:

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
author был просто примером ключевого слова, есть несколько других, которые можно рассмотреть. В этом задании достаточно просто рассмотреть ключевое слово ЛЮБОЕ слово, за которым следует :. В этом случае author следует заменить любым словом.
GRoutar 12.03.2019 18:25

@Khabz, мое недоразумение. Обновлено.

Austin 12.03.2019 18:28

Обратите внимание, что это соответствует дополнительному пробелу и соответствует только title в начале строки.

blhsing 12.03.2019 18:35

@blhsing, нужно исправить это сейчас.

Austin 12.03.2019 18:38

Вы можете использовать положительный шаблон просмотра вперед с чередованием слова, за которым следует двоеточие и, возможно, которому предшествует 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

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