【问题标题】:python regex to parse key value pairs with multiple lines in the valuepython 正则表达式解析值中包含多行的键值对
【发布时间】:2023-03-16 03:15:01
【问题描述】:

我正在尝试解析具有多个键、值行的文件,如下所示

"key1" = "value1";
"key2" = "value2";
"key3" = "value3_line1
value3_line2
value3_line3";
"key4" = "value4";

我正在使用下面的代码来解析这个文件

def parseFile(f):
    regex = re.compile(r'^"(.*)"\s+=\s+"(.*)";',re.MULTILINE)
    with open(f) as string_file:
        alllines = string_file.read()
        matches = [m.groups() for m in regex.finditer(alllines)]
        for m in matches:
            print(m[0], '=>', m[1])

此代码匹配具有 key1、key2 和 key4 但不匹配 key3 的行。如何解决此问题以获取所有键值对,包括具有多行值的键值对?

【问题讨论】:

  • regex = re.compile(r'^"(.*)"\s+=\s+"(.*)"?;?',re.MULTILINE) ?

标签: python regex


【解决方案1】:

您可以使用re.DOTALL 标志,它允许. 匹配换行符。您还应该使用非贪婪量词 *? 来匹配最近的双引号对:

变化:

regex = re.compile(r'^"(.*)"\s+=\s+"(.*)";',re.MULTILINE)

到:

regex = re.compile(r'^"(.*?)"\s+=\s+"(.*?)";',re.MULTILINE | re.DOTALL)

或者,您可以使用排除" 的字符类:

regex = re.compile(r'^"([^"]*)"\s+=\s+"([^"]*)";',re.MULTILINE)

【讨论】:

  • 这是一个贪婪的匹配..它把所有行都作为键,直到“key4”作为键,“value4”作为值。如何使它匹配第一个';'而不是最后一个?
  • 我的错。我没看到你加了“?”在正则表达式中。那成功了。感谢您的快速响应和完美答案。
【解决方案2】:

它与"key3" 不匹配,因为该行缺少引号和分号。

尝试模式re.compile(r'^"(.*)"\s+=\s+"(.*)"?;?',re.MULTILINE)re.compile(r'^"(.*)"\s+=\s+"(.*)$',re.MULTILINE)

例如:

import re

s = '''"key1" = "value1";
"key2" = "value2";
"key3" = "value3_line1
value3_line2
value3_line3";
"key4" = "value4";'''

regex = re.compile(r'^"(.*)"\s+=\s+"(.*)"?;?',re.MULTILINE) 
matches = [m.groups() for m in regex.finditer(s)]
for m in matches:
    print(m[0], '=>', m[1])

输出:

('key1', '=>', 'value1";')
('key2', '=>', 'value2";')
('key3', '=>', 'value3_line1')
('key4', '=>', 'value4";')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    相关资源
    最近更新 更多