我尝试解析使用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
有没有办法将参数转换为涵盖所有这些场景的字典?
答案 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')]
说明:
(?:^|, )
:参数必须位于字符串的开头或以逗号和空格开头。这是一个非捕获组,用于包含|
的效果,但未显示在findall
的结果中。(\w+)
:参数名称(.+?)
:参数值。(?=$|, \w+=)
:参数值必须后跟字符串的结尾或其他参数。这是一个先行断言,而不仅仅是一个非捕获组,因此匹配不会消耗字符串。否则findall
仅查找每个第二个参数,因为它只找到非重叠匹配。