#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']