从inspect.formatargvalues格式化的字符串中提取arg值

时间:2018-05-10 16:32:34

标签: python string parsing

我尝试解析使用inspect.formatargvalues格式化的字符串,我希望能够提取参数值并将其保存在字典中。

以下是文字的一些例子:

CALL function.a(timeout_secs=10)
CALL function.b(x=something good (happy days, ABC 123), y_z=None, check_this=True, check_this_2=None, extra_info=None, press=False, timeout_secs=30)
CALL function.c(key='A_B')
CALL function.d(target=<Tab.Chrome: 'tab-chrome'>)
CALL function.e(music_type=<MusicType.ALBUM: 1>, term=None, genre=None, results=True)
CALL function.f(button='END', delay=None)

目前我使用正则表达式提取参数来获取:

timeout_secs=10
x=something good (happy days, ABC 123), y_z=None, check_this=True, check_this_2=None, extra_info=None, press=False, timeout_secs=30
key='A_B'
target=<Tab.Chrome: 'tab-chrome'>
music_type=<MusicType.ALBUM: 1>, term=None, genre=None, results=True
button='END', delay=None

然后我分裂了&#39;,&#39;然后将数组转换为字典。

dict(parameter.split("=") for parameter in array_of_parameters)

这在很大程度上起作用,但在解析时显然会中断:

x=something good (happy days, ABC 123), y_z=None, check_this=True, check_this_2=None, extra_info=None, press=False, timeout_secs=30

有没有办法将参数转换为涵盖所有这些场景的字典?

1 个答案:

答案 0 :(得分:0)

找不到可以在所有情况下都能正常工作的解决方案是不可能的,因为参数值可以包含任何内容,而这不是设计用于解析的正确数据格式。这是一些更好的工作:

import re

line = 'x=something good (happy days, ABC 123), y_z=None, check_this=True, check_this_2=None, extra_info=None, press=False, timeout_secs=30'

print(re.findall(r'(?:^|, )(\w+)=(.+?)(?=$|, \w+=)', line))
# [('x', 'something good (happy days, ABC 123)'), ('y_z', 'None'), ('check_this', 'True'), ('check_this_2', 'None'), ('extra_info', 'None'), ('press', 'False'), ('timeout_secs', '30')]

说明:

  1. (?:^|, ):参数必须位于字符串的开头或以逗号和空格开头。这是一个非捕获组,用于包含|的效果,但未显示在findall的结果中。
  2. (\w+):参数名称
  3. (.+?):参数值。
  4. (?=$|, \w+=):参数值必须后跟字符串的结尾或其他参数。这是一个先行断言,而不仅仅是一个非捕获组,因此匹配不会消耗字符串。否则findall仅查找每个第二个参数,因为它只找到非重叠匹配。