匹配键值对

时间:2018-04-05 17:48:52

标签: python regex

在下文中,我想用它们的值提取键。 我编写了以下正则表达式,但它与多行中的值不匹配。正则表达式:--(.*)=.*(?=(.|--|\n|\Z)*)

--some text here not to be matched
--key1=this is a
 multiline statement
 statement
--random text not to be matched
--key2=val2
--key3=val3
--random text here not to be matched

所以,匹配后输出应该是

--key1=this is a
 multiline statement
 statement
--key2=val2
--key3=val3

3 个答案:

答案 0 :(得分:2)

你可以试试这个:

import re
s = """
 --some text here not to be matched
 --key1=this is a
 multiline statement
 statement
 --random text not to be matched
 --key2=val2
 --key3=val3
 --random text here not to be matched
"""
new_data = re.findall('\-\-\w+\=[a-zA-Z\s\n]+', s)
for i in new_data:
  print(i)

输出:

--key1=this is a
multiline statement
statement
--key2=val
--key3=val

答案 1 :(得分:1)

如果任何值包含-,则Ajax的答案将失败。相反,请执行否定的检查以确保val不包含--

此正则表达式将执行此操作:--.+=((?!--)[\S\s])+

Regex101 link

答案 2 :(得分:0)

也许OP提供了一个简单的例子,在实际代码中,将需要正则表达式,但上面的例子可以在没有正则表达式的情况下进行过滤

这种过滤掉垃圾行的方法的核心见解是删除所有以--开头但不包含=的行。

text = """--some text here not to be matched
   --key1=this is a
    multiline statement
    statement
   --random text not to be matched
   --key2=val2
   --key3=val3
   --random text here not to be matched"""

valid_lines = [l for l in text.split('\n') if not (l.startswith('--') and '=' not in l)]

result = '\n'.join(valid_lines)

print(result)
# output
--key1=this is a
 multiline statement
 statement
--key2=val2
--key3=val3

从结果文本中构造字典:

mydata = {data.split('=')[0]:data.split('=')[1].strip('\n') for data in result.strip('-').split('--')}
print(mydata)
#outputs:
{'key1': 'this is a\n multiline statement\n statement', 'key2': 'val2', 'key3': 'val3'}