python正则表达式,用于解析值中有多行的键值对

python正则表达式,用于解析值中有多行的键值对,python,regex,Python,Regex,我试图解析一个包含多个键、值行的文件,如下所示 "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 s

我试图解析一个包含多个键、值行的文件,如下所示

"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])
此代码与具有键1、键2和键4的行匹配,但与键3不匹配。如何解决此问题以获取所有键值对,包括具有多行值的键值对?

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

更改:

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

或者,可以使用不包括以下内容的字符类:

它与键3不匹配,因为该行缺少引号和分号

请尝试重新编译模式“^.*\s+=\s+.*?;?”,re.MULTILINE或re.compiler'^.*\s+=\s+.*$',re.MULTILINE

例:

输出:


regex=re.compiler'^.*\s+=\s+.*?;?',关于MULTILINE?这是一个贪婪的匹配。。它使用所有行,直到键4作为键,值4作为值。如何使它匹配第一个“;”而不是最后一个?我的错。我没看到你在正则表达式中加了“?”。这就成功了。感谢您的快速回复和完美答案。
regex = re.compile(r'^"(.*?)"\s+=\s+"(.*?)";',re.MULTILINE | re.DOTALL)
regex = 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";')