我有一个字符串表达式像param1=123,param2=bbb
我想获得类似{'param1':'123','param2':'bb'}
的列表
或至少['param1=123','param2=bbb']
不幸的是,设计给出了
re.match('^(w+?=w+?,?)+$','param1=123,param2=bbb').groups()
不能产生期望的结果
当然,是一个更大的表达式的一部分,我想通过使用regexp
>>> dict(re.findall(r'(w+)=(w+)','param1=123,param2=bbb'))
{'param2': 'bbb', 'param1': '123'}
我建议避免使用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'}
正则表达式只能返回字符串。模式中的每一组产生一个字符串。你的模式中只有一个组,所以它只能为那个组返回一个字符串。你想要的是不可能与一个单一的匹配的regex模式。
相反,您可以使用finditer
在字符串中多次找到一个模式,但这打破了您的要求,即该模式是更大模式的一部分。
您唯一的选择是将所有赋值匹配为一个字符串,然后在后面用逗号分隔。
您的字符串看起来非常像查询字符串参数。使用Python的urlparse库怎么样?它不能使用逗号作为分隔符,但您可以将它们更改为分号。
params = 'param1=123,param2=bbb'
params2 = params.replace(',', ';')
import urlparse
urlparse.parse_qs(params2) => {'param2': ['bbb'], 'param1': ['123']}
对于这些答案,我假设您有一个具有参数名称和参数值对的字符串,格式与示例中一样,如'param1=value1,param2=value2,param3=value3"
这是一个通用的正则表达式,将parameter name
(=) parameter value
对解析为每个匹配
(?<=^|,)([^=]*)=([^,]*)(?=,s?)
如果你想要一个像{'param1':'123','param2':'bb'}
这样的字符串,你可以运行这个replacement regex:
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)
语句中使用这个表达式:
(?<=^|,)([^=]*)|(?<==)([^,]*)
…这将匹配逗号之后(,
)但等号之前(=
)的部分,或者匹配等号之后但逗号之前的部分。它将匹配零长度的名称和值。,以便索引可以表示数据的类型。若要只匹配至少包含一个字符的名称或值,请使用+
而不是*
- 这样做可能会导致索引不对齐