Python正则表达式:为什么可选匹配总是返回null?

2024-04-18 14:28:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在课文中理解一下协议。如果我这样做:

>>> d = re.search(re.compile(r".*(?P<protocol>(http\/\d\.\d)?) (?P<statuscode>\d{3})"), 'khkhjkhkhkh HTTP/1.1 303')
>>> d.groupdict()["protocol"]

结果将为空,因为如果删除“?”,to将协议与.*匹配对于协议,它在这种情况下运行良好,但在缺少协议的情况下不起作用,例如“khjkhkhhhh303”。我知道正则表达式与协议匹配而不是与协议匹配是令人困惑的,但是有什么方法可以解决这个问题吗?你知道吗


Tags: to方法rehttp协议search情况protocol
1条回答
网友
1楼 · 发布于 2024-04-18 14:28:56

由于协议模式是可选的,因此第一个.*将尽可能匹配(贪婪)到强制状态码模式。根据注释,您需要非贪婪变量:.*?。你知道吗

您还需要匹配不区分大小写,因为您的模式有http,但搜索字符串有HTTP。你知道吗

一起:

>>> import re
>>> regex = re.compile(r".*?(?P<protocol>(http/\d\.\d)?) (?P<statuscode>\d{3})", re.I)
>>> match = regex.search('khkhjkhkhkh HTTP/1.1 303')
>>> match.groupdict()['protocol']
'HTTP/1.1'

(无需跳过正斜杠。)

相关问题 更多 >