如何使用一个regex命令解析多行?

时间:2017-07-24 19:57:55

标签: python regex parsing

我有两行看起来像

Content-Type: text/plain
Content-Type: text/plain; charset=UTF-8

要解析,我使用("^Content-Type:\s(.*)")之类的命令来捕获(text/plain)部分。另一方面,我使用("^Content-Type:\s(.*)[;]")之类的正则表达式来捕获相同的字符串(text/plain)。有什么方法可以使用一个适用于这两种情况的方法吗?我正在使用python,我是regex的新手。感谢

3 个答案:

答案 0 :(得分:2)

您可以稍微修改一下Regex:

Content-Type:\s([^;\s]*)

这是一个有用的链接:Regex101

答案 1 :(得分:0)

看起来您正在寻找?量词(list in the docs中的第6位)。它将允许尾部显示一次或根本不显示,包括两种情况:

^Content-Type:\s+([^;]+)(?:;.*)?

以下是我建议的更改:

  • 不要捕获捕获组中的.*贪婪,因此 有时会收到不良字符:例如如果字符串中有两个分号,则第一个分号将被捕获。取而代之的是捕获[^;],这意味着"除了分号之外的任何东西"。
  • 将主要catpure组中的量词从*更改为+。您希望至少有一个字符匹配,这是+表达的内容。
  • 为了安全起见,我还会将+量词添加到前面的\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

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