在正则表达式中捕获可选部分

时间:2011-01-12 09:41:20

标签: python regex

我有一个输入文本,可以是:

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

或只是:

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

如何在Python中将URL和cookie捕获到两个单独的变量中?我不知道如何指定的部分是可选的cookie。

感谢。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

只需使用单独的捕获组,并使用?作为正则表达式的可选部分。如果捕获组未捕获任何内容,则组的值将为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()

答案 2 :(得分: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

答案 3 :(得分:0)

将可选部分包含在(Cookie:xxx; yyy“)中?