gpt4 book ai didi

python - 为什么这个 HTTP header 的正则表达式在值包含单字符标记时无法匹配?

转载 作者:可可西里 更新时间:2023-11-01 16:21:17 24 4
gpt4 key购买 nike

这是我通过转录 RFC 7230's definition of "header-field" 构建的 Python 正则表达式,也就是说,它应该匹配 Connection: close:

rb"^(?P<field_name>[-!#$%&%&'*+.^_`|~0-9a-zA-Z]+):[ \t]*(?P<field_value>([\x21-\xff]([ \t]+[\x21-\xff])?)*)[ \t]*$"

(查看 RFC 7230 肯定有助于理解它。)

出于某种原因我无法理解,不过,它似乎有效除非字段值包含一个两边都有空格的非空白字符:

In [36]: r = re.compile(rb"^(?P<field_name>[-!#$%&%&'*+.^_`|~0-9a-zA-Z]+):[ \t]*(?P<field_value>([\x21-\xff]([ \t]+[\x21-\xff])?)*)[ \t]*$")

In [38]: r.match(b"Foo: bar")
Out[38]: <_sre.SRE_Match object; span=(0, 8), match=b'Foo: bar'>

In [39]: r.match(b"Foo: bar baz quux")
Out[39]: <_sre.SRE_Match object; span=(0, 17), match=b'Foo: bar baz quux'>

In [40]: r.match(b"Foo: bar baz a quux")

In [41]: r.match(b"Foo: bar baz quux a")
Out[41]: <_sre.SRE_Match object; span=(0, 19), match=b'Foo: bar baz quux a'>

为什么第三个例子匹配失败,而其他的都成功了?

最佳答案

你应该使用这个正则表达式:

^(?P<field_name>[-!#$%&%&'*+.^_`|~0-9a-zA-Z]+):[ \t]*(?P<field_value>[\x21-\xff]+(?:[ \t]+[\x21-\xff]+)*)[ \t]*$

RegEx Demo

您的正则表达式的这一部分有问题:

([\x21-\xff]([ \t]+[\x21-\xff])?)*

因为它不会匹配单个字母和可选空格之后的任何内容(行尾之前)。

关于python - 为什么这个 HTTP header 的正则表达式在值包含单字符标记时无法匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36980341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com