如何使用一个正则表达式命令解析多行?



我有两行看起来像

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

它更冗长,但从理论上讲,它应该更快。

最新更新