улавливание необязательной части в регулярном выражении

#python #regex

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

Вопрос:

У меня есть входной текст, который может быть либо:

 "URL: http://www.cnn.com Cookie: xxx; yyy"
  

или просто:

 "URL: http://www.cnn.com"
  

Как мне преобразовать URL-адрес и cookie-файл в две отдельные переменные в Python? Часть, которую я не знаю, как указать, является необязательным файлом cookie.

Спасибо.

Ответ №1:

 str = 'URL: http://www.cnn.com Cookie: xxx; yyy'

match = re.search(r'URL: (S )( Cookie: (.*))?', str)
print match.group(1)
print match.group(3)

>>> http://www.cnn.com
>>> xxx; yyy
  

Комментарии:

1. Спасибо, я не знал, что группы могут быть вложенными.

Ответ №2:

 import re

inputstring = "URL: http://www.cnn.com Cookie: xxx; yyy"

if 'Cookie' in inputstring:
    m = re.match('URL: (.*?) Cookie: (.*)', inputstring)
    if m:
        url = m.group(1)
        cookie = m.group(2)
        print url
        print cookie
else:
    m = re.match('URL: (.*)', inputstring)
    if m:
        url = m.group(0)
        print url
  

Ответ №3:

Просто используйте отдельные группы захвата и ? для необязательной части вашего регулярного выражения. Если группа захвата ничего не захватывает, значение группы будет None .

 >>> regex = re.compile(r'URL: (S )(?:s Cookie: (S ))?')
>>> regex.match("URL: http://www.cnn.com Cookie: xxx;yyy").groups()
('http://www.cnn.com', 'xxx;yyy')
>>> regex.match("URL: http://www.cnn.com").groups()
('http://www.cnn.com', None)
  

Я только что использовал S для приведенных выше шаблонов URL и cookie для целей примера. Замените их вашим реальным URL и шаблонами cookie.

Вместо groups() вы можете использовать group(1) и group(2) — поведение такое же, но groups() удобно при распаковке. например:

 url, cookie = match.groups()
  

Ответ №4:

Вложить необязательную часть в (Cookie: xxx; гггг»)?