使用regexp获取变量列表



我有一个字符串表达式像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)语句中使用这个表达式:

(?<=^|,)([^=]*)|(?<==)([^,]*)

…这将匹配逗号之后(,)但等号之前(=)的部分,或者匹配等号之后但逗号之前的部分。它将匹配零长度的名称和值。,以便索引可以表示数据的类型。若要只匹配至少包含一个字符的名称或值,请使用+而不是* - 这样做可能会导致索引不对齐

最新更新