我有两行看起来像
Content-Type: text/plain
Content-Type: text/plain; charset=UTF-8
要解析,我使用("^Content-Type:\s(.*)")
之类的命令来捕获(text/plain)
部分。另一方面,我使用("^Content-Type:\s(.*)[;]")
之类的正则表达式来捕获相同的字符串(text/plain)
。有什么方法可以使用一个适用于这两种情况的方法吗?我正在使用python,我是regex的新手。感谢
答案 0 :(得分:2)
答案 1 :(得分:0)
看起来您正在寻找?
量词(list in the docs中的第6位)。它将允许尾部显示一次或根本不显示,包括两种情况:
^Content-Type:\s+([^;]+)(?:;.*)?
以下是我建议的更改:
.
。 *
贪婪,因此 有时会收到不良字符:例如如果字符串中有两个分号,则第一个分号将被捕获。取而代之的是捕获[^;]
,这意味着"除了分号之外的任何东西"。*
更改为+
。您希望至少有一个字符匹配,这是+
表达的内容。+
量词添加到前面的\s
。如果发生这种情况,它将允许您匹配多个空格。;
匹配的部分设为非捕获组(以(?:
开头的组。这样您就可以将?
量词应用于它。正如@RudyTheHunter间接指出的那样,如果你使用普通的re.match
,那么自^
看起来你就不需要分号后的前导match
或尾随部分在字符串的开头。
因此您只能使用
Content-Type:\s+([^;]+)
答案 2 :(得分:0)
正如我在评论中所说的,正则表达式对于这样一个简单的匹配是一种矫枉过正,所以为了完整起见:
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
它更冗长,但理论上它应该更快。