Регулярное выражение для подстроки запроса - PullRequest
0 голосов
/ 12 марта 2019

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

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

Ответы [ 3 ]

1 голос
/ 12 марта 2019

Вы можете использовать шаблон с положительным прогнозом:

.*?(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
0 голосов
/ 12 марта 2019

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

Как насчет:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...