使用正则表达式获取变量列表

时间:2011-10-14 20:13:39

标签: python regex

我有一个像param1=123,param2=bbb

这样的字符串表达式

我想获得类似{'param1':'123','param2':'bb'}

的列表

或者至少['param1=123','param2=bbb']

不幸的是,设计提供了

re.match('^(\w+?=\w+?,?)+$','param1=123,param2=bbb').groups()

不会产生预期的结果

当然 - 这是一个更大的表达式的一部分,我想通过使用regexp得到这个结果

5 个答案:

答案 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)语句中使用这个表达式:

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

...这将匹配逗号(,)之后但在等号(=之前)的部分,或者它将匹配等号后但在逗号之前的部分。它将匹配零长度名称和值。,以便索引可以表示数据类型。要仅使用至少一个字符匹配名称或值,请使用+代替* - 这样做可能会导致索引错位