Python Regex键值匹配

时间:2019-03-26 15:00:14

标签: regex python-3.x regex-greedy

我正在尝试分析一个包含键值对的文件。该键以“-”开头,后跟字母字符,并在其后跟值,如下图所示。

当我使用下面的正则表达式模式解析文件时,我很容易获得键和值,但是当值包含多个单词或带引号的数据(也与键值匹配)时,我的模式匹配失败。我已经尝试过多次进行正则表达式模式匹配,但是无法获得所需的输出。我设法找到一个正则表达式模式以匹配引用的文本'“(。*?)”',但无法同时使用两种模式。感谢您在下面获得所需输出的任何帮助。

Keys and Values

我的代码(仅第一行需要的结果)

mystring = '''-desc none -type used -cost med -color blue
-desc none -msg This is a a message -name test
-desc "(-type old -cost high)" -color green'''

mydict = {}
item_num = 0
for line in mystring.splitlines():
    quoted = re.findall('"(.*?)"', line)
    key_value = re.findall('(-\w+\s+)(\S+)', line)
    print(key_value)

### Output ###
[('-desc ', 'none'), ('-type ', 'used'), ('-cost ', 'med'), ('-color ', 'blue')]
[('-desc ', 'none'), ('-msg ', 'This'), ('-name ', 'test')]
[('-desc ', '"(-type'), ('-cost ', 'high)"'), ('-color ', 'green')]

### Desired Output ###
[('-desc ', 'none'), ('-type ', 'used'), ('-cost ', 'med'), ('-color ', 'blue')]
[('-desc ', 'none'), ('-msg ', 'This is a message'), ('-name ', 'test')]
[('-desc ', "(-type old -cost high)"), ('-color ', 'green')]

2 个答案:

答案 0 :(得分:0)

您可以使用

(-\w+)\s+("[^"]*"|.*?)(?=$|\s*-\w+\s)

请参见regex demo

详细信息

  • (-\w+)-第1组:-和1个以上的字符字符
  • \s+-超过1个空格
  • ("[^"]*"|.*?)-第2组:",除了"以外的0+个字符,然后是"或除换行符以外的任何0+字符,请尽可能少,直到第一个...
  • (?=$|\s*-\w+\s)-字符串结尾或0+个空格,-,1个单词字符和一个空格。

Regulex图:

enter image description here

请参见Python demo

import re
mystring = '''-desc none -type used -cost med -color blue
-desc none -msg This is a a message -name test
-desc "(-type old -cost high)" -color green'''

mydict = {}
for line in mystring.splitlines():
    key_value = re.findall(r'(-\w+)\s+("[^"]*"|.*?)(?=$|\s*-\w+\s)', line)
    print(key_value)

输出:

[('-desc', 'none'), ('-type', 'used'), ('-cost', 'med'), ('-color', 'blue')]
[('-desc', 'none'), ('-msg', 'This is a a message'), ('-name', 'test')]
[('-desc', '"(-type old -cost high)"'), ('-color', 'green')]

答案 1 :(得分:0)

这是您可以使用的最佳正则表达式:
更改投票永远不会太晚。

正则表达式原始

(?<!\S)-(\w+)\s+("[^"]*"|[^\s"-]+(?:\s+[^\s"-]+)*)(?!\S)

python raw

r"(?<!\S)-(\w+)\s+(\"[^\"]*\"|[^\s\"-]+(?:\s+[^\s\"-]+)*)(?!\S)"

https://regex101.com/r/7bYN1A/1

键=组1
值=组2

 (?<! \S )
 -
 ( \w+ )                       # (1)
 \s+ 
 (                             # (2 start)
      " [^"]* "
   |  [^\s"-]+ 
      (?: \s+ [^\s"-]+ )*
 )                             # (2 end)
 (?! \S )

基准

Regex1:   (?<!\S)-(\w+)\s+("[^"]*"|[^\s"-]+(?:\s+[^\s"-]+)*)(?!\S)
Options:  < none >
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   10
Elapsed Time:    1.66 s,   1660.05 ms,   1660048 µs
Matches per sec:   301,196