Как настроить таргетинг на несколько строк с помощью одного шаблона регулярных выражений

#python #regex

#python #регулярное выражение

Вопрос:

У меня есть несколько строк, таких как

 POST /incentivize HTTP/1.1
DELETE /interactive/transparent/niches/revolutionize HTTP/1.1
DELETE /virtual/solutions/target/web services HTTP/2.0
PATCH /interactive/architect/innovative/24/7 HTTP/1.1
 

Я хочу настроить таргетинг на все эти строки regex .

Я попробовал следующий шаблон

 pattern = r"([A-Z]* /([A-Za-z0-9])D  [A-Z]*/d.d)"
 

Вот полный код

 string = """
POST /incentivize HTTP/1.1
DELETE /interactive/transparent/niches/revolutionize HTTP/1.1
DELETE /virtual/solutions/target/web services HTTP/2.0
PATCH /interactive/architect/innovative/24/7 HTTP/1.1
"""

pattern = r"(?P<url>[A-Z]* /([A-Za-z0-9])D  [A-Z]*/d.d)"

result = [item.groupdict() for item in re.finditer(pattern,string)]

result
 

Это выводит следующее

 [{'url': 'POST /incentivize HTTP/1.1'},
 {'url': 'DELETE /interactive/transparent/niches/revolutionize HTTP/1.1'},
 {'url': 'DELETE /virtual/solutions/target/web services HTTP/2.0'}]
 

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

Я новичок в python и только начал учиться regex .

Любая помощь будет оценена.

Ответ №1:

Я бы использовал re.findall здесь следующий шаблон регулярных выражений:

 b(?:POST|GET|PUT|PATCH|DELETE)b /[^/s] (?:/[^/s] )* HTTP/d (?:.d )?
 

Скрипт:

 string = """
POST /incentivize HTTP/1.1
DELETE /interactive/transparent/niches/revolutionize HTTP/1.1
DELETE /virtual/solutions/target/web services HTTP/2.0
PATCH /interactive/architect/innovative/24/7 HTTP/1.1
"""
matches = re.findall(r'b(?:POST|GET|PUT|PATCH|DELETE)b /[^/s] (?:/[^/s] )* HTTP/d (?:.d )?', string)
print(matches)
 

Это выводит:

 ['POST /incentivize HTTP/1.1',
 'DELETE /interactive/transparent/niches/revolutionize HTTP/1.1',
 'DELETE /virtual/solutions/target/web services HTTP/2.0',
 'PATCH /interactive/architect/innovative/24/7 HTTP/1.1']
 

Шаблон регулярных выражений работает путем чередования одного из нескольких методов HTTP, к которым вы можете добавить дополнительные методы, если это необходимо. Затем он соответствует пути, за которым следует HTTP и номер версии.

Ответ №2:

Это регулярное выражение работает с шаблоном: ([A-Z]* (?:/[A-z0-9 %]*) [A-Z]*/d.d) :

 >>> string = """
POST /incentivize HTTP/1.1
DELETE /interactive/transparent/niches/revolutionize HTTP/1.1
DELETE /virtual/solutions/target/web services HTTP/2.0
PATCH /interactive/architect/innovative/24/7 HTTP/1.1
"""
>>> re.findall("([A-Z]* (?:/[A-z0-9 %]*)  [A-Z]*/d.d)", string)
['POST /incentivize HTTP/1.1',
 'DELETE /interactive/transparent/niches/revolutionize HTTP/1.1',
 'DELETE /virtual/solutions/target/web services HTTP/2.0',
 'PATCH /interactive/architect/innovative/24/7 HTTP/1.1']