我有两行看起来像
Content-Type: text/plain
Content-Type: text/plain; charset=UTF-8
为了解析,我使用了类似("^Content-Type:s(.*)")
的命令来捕获(text/plain)
部分。另一方面,我使用像("^Content-Type:s(.*)[;]")
这样的正则表达式来捕获相同的字符串(text/plain)
。有什么方法可以使用在两种情况下都有效的方法吗?我正在使用python,我是正则表达式的新手。谢谢
你可以稍微修改一下你的正则表达式:
Content-Type:s([^;s]*)
这是一个工作链接:正则表达式101
看起来您正在寻找?
量词(文档中列表中排名第 6(。它将允许尾随部分出现一次或根本不出现,涵盖两种情况:
内容类型:\s+([^;]+((?:;.*)?
以下是我建议的更改:
- 不要捕获捕获组中的
.
。*
是贪婪的,所以你有时会得到不需要的字符:例如,如果你在字符串中有两个分号,第一个会被捕获。相反,捕获[^;]
,这意味着"除分号以外的任何内容"。 - 将主 catpure 组中的量词从
*
更改为+
。您希望至少匹配一个字符,这就是+
表达的内容。 - 为了安全起见,我还会将
+
量词添加到前面的s
中。如果发生这种情况,它将允许您匹配多个空格。 - 将匹配
;
的部分放入非捕获组(以(?:
开头的组。这允许您对其应用?
量词。
正如@RudyTheHunter间接指出的那样,如果你使用普通re.match
,你根本不需要分号后面的前导^
或尾随部分,因为match
在字符串的开头看起来。
因此,您可以只使用
Content-Type:s+([^;]+)
正如我在评论中所说,正则表达式对于如此简单的匹配来说是矫枉过正的,所以为了完整起见:
def parse_content_type(data):
if data.lower()[:13] == "content-type:": # HTTP headers are case-insensitive by spec.
index = data.find(";") # find the position of `;`
return data[13:index if index > -1 else len(data)].strip() # slice and strip
print(parse_content_type("Content-Type: text/plain")) # text/plain
print(parse_content_type("Content-Type: text/plain; charset=UTF-8")) # text/plain
它更冗长,但从理论上讲,它应该更快。