我有一个像param1=123,param2=bbb
我想获得类似{'param1':'123','param2':'bb'}
或者至少['param1=123','param2=bbb']
不幸的是,设计提供了
re.match('^(\w+?=\w+?,?)+$','param1=123,param2=bbb').groups()
不会产生预期的结果
当然 - 这是一个更大的表达式的一部分,我想通过使用regexp得到这个结果
答案 0 :(得分:3)
>>> dict(re.findall(r'(\w+)=(\w+)','param1=123,param2=bbb'))
{'param2': 'bbb', 'param1': '123'}
答案 1 :(得分:2)
我建议避免使用regexp并拆分分隔符。例如。 :
>>> sample = 'param1=123,param2=bbb'
>>> [ x.split('=',1) for x in sample.split(',') ]
[['param1', '123'], ['param2', 'bbb']]
>>> dict([ x.split('=',1) for x in sample.split(',') ])
{'param2': 'bbb', 'param1': '123'}
答案 2 :(得分:0)
正则表达式只能返回字符串。模式中的每个组都会生成一个字符串。您的模式中只有一个组,因此它只能为该组返回一个字符串。只需匹配一个正则表达式模式,就不可能得到你想要的东西。
相反,您可以使用finditer
在字符串中多次查找模式,但这会破坏您对更大模式的一部分的要求。
您唯一的选择是将所有作业匹配为一个字符串,然后在逗号上拆分。
答案 3 :(得分:0)
您的字符串看起来非常类似于查询字符串参数。使用Python的urlparse库怎么样?它不能用逗号作为分隔符,但您可以将它们更改为分号。
params = 'param1=123,param2=bbb'
params2 = params.replace(',', ';')
import urlparse
urlparse.parse_qs(params2) => {'param2': ['bbb'], 'param1': ['123']}
答案 4 :(得分:0)
对于这些答案,我假设您有一个字符串,其参数名称和参数值对的格式与示例中的格式相同,如'param1=value1,param2=value2,param3=value3"
这是一个通用的正则表达式,可以将每个匹配的parameter name
(=)parameter value
对解析成组
(?<=^|,)([^=]*)=([^,]*)(?=,\s?)
如果你想要一个像{'param1':'123','param2':'bb'}
这样的字符串,你可以运行这个替换正则表达式:
match expression: (?<=^|,)([^=]*)=([^,]*)(,?)
replace expression: '\1':'\2'\3
...然后将所有这些封装在大括号{
和}
中...将其提供给eval语句,并且您有一个字典。 (我从来没有编写python,但是......)我相信你可以做到以下几点:
inputString = "param1=value1,param2=value2,param3=value3"
myParamDictionary = eval('{' + re.sub("(?<=^|,)([^=]*)=([^,]*)(,?)", "'\1':'\2'\3", inputString)
...但我从来没有用Python编程... python的灵活性似乎可能有更好的方法...
如果你只是想要一个带有名称和值的数组(除了它们的索引是偶数或奇数之外没有标识),你可以在re.findall(regex, subject)
语句中使用这个表达式:
(?<=^|,)([^=]*)|(?<==)([^,]*)
...这将匹配逗号(,
)之后但在等号(=
之前)的部分,或者它将匹配等号后但在逗号之前的部分。它将匹配零长度名称和值。,以便索引可以表示数据类型。要仅使用至少一个字符匹配名称或值,请使用+
代替*
- 这样做可能会导致索引错位。