基于Python正则表达式的拆分

基于Python正则表达式的拆分,python,regex,Python,Regex,将下面的字符串“(x=1,y=2,z=3)(a=1)(m=4,n=6,o=2)”拆分为任意形式的键值对的最佳方法是什么?我对(x,1)(y,2)(z,3)等感兴趣 无以下正则表达式(用于提取括号之间的信息) 编辑:抱歉没有弄清楚,这里的分组也很重要,比如[('x',1),('y',2),('z',3)],[('a',1)],[('m',4),('n'6),('o',2)]你只需要提取所有的单词和数字,然后zip()然后使用dict()函数制作一本字典 所以试试这个: import re stri

将下面的字符串
“(x=1,y=2,z=3)(a=1)(m=4,n=6,o=2)”
拆分为任意形式的键值对的最佳方法是什么?我对(x,1)(y,2)(z,3)等感兴趣

无以下正则表达式(用于提取括号之间的信息)


编辑:抱歉没有弄清楚,这里的分组也很重要,比如
[('x',1),('y',2),('z',3)],[('a',1)],[('m',4),('n'6),('o',2)]
你只需要提取所有的单词和数字,然后
zip()
然后使用
dict()
函数制作一本字典

所以试试这个:

import re
string = "(x=1, y = 2, z = 3 ) (a = 1) (m = 4, n = 6, o = 2)"

stripped = ''.join(re.findall('\w+',string))
words= re.findall('\D+',stripped)
numbers= map(int,re.findall('\d+',string))
print dict(zip(words,numbers))
输出:

{'a': 1, 'm': 4, 'o': 2, 'n': 6, 'y': 2, 'x': 1, 'z': 3}
编辑: 正如您所说,分组很重要,我建议您只压缩它们,因为字典没有排序

print zip(words,numbers)
#[('x', 1), ('y', 2), ('z', 3), ('a', 1), ('m', 4), ('n', 6), ('o', 2)]
但是,您可以使用
OrderedDict

from collections import OrderedDict

print OrderedDict(zip(words,numbers))
#OrderedDict([('x', '1'), ('y', '2'), ('z', '3'), ('a', '1'), ('m', '4'), ('n', '6'), ('o', '2')])

假设字符串语法从未出错:

re.findall('([a-z]+)\s*=\s*([0-9]+)', 
           "(x=1, y = 2, z = 3 ) (a = 1) (m = 4, n = 6, o = 2)")

如果您喜欢迭代器,您也可以选择查找迭代器。

给您。完整代码已准备就绪:

>>> import re
>>> pairs = "(x=1, y = 2, z = 3 ) (a = 1) (m = 4, n = 6, o = 2)"
>>> pairs_map = [(m[1], m[2]) for m in re.findall(r"((\w+)\s*\=\s*(\w+))", pairs)]
>>> pairs_map
[('x', '1'), ('y', '2'), ('z', '3'), ('a', '1'), ('m', '4'), ('n', '6'), ('o', '2')]
>>> dict(pairs_map)
{'a': '1', 'm': '4', 'o': '2', 'n': '6', 'y': '2', 'x': '1', 'z': '3'}
应该是直截了当的。它匹配所有事件


word
可能是空白
可能是空白
word
您不能在一个正则表达式中执行此操作,因为您需要一个嵌套结构。正则表达式匹配总是平淡的

但是,使用两个正则表达式可以很容易地完成:

import re
from pprint import pprint

thestr = "(x=1, y = 2, z = 3 ) (a = 1) (m = 4, n = 6, o = 2)"
groups = re.findall(r'\([^)]+\)', thestr)
matches = []

for group in groups:
    matches.append(re.findall(r'(\w+)\s*=\s*(\d+)', group))

pprint(matches)
将输出:

[[('x', '1'), ('y', '2'), ('z', '3')],
 [('a', '1')],
 [('m', '4'), ('n', '6'), ('o', '2')]]

你试了什么?请出示您的代码。这是一个完整的示例吗?或者是否存在任何合理的x=y映射格式?e、 g.(x=y,…{a=b;…}分组中有任何信息不应该被丢弃吗?@rednaw我对正则表达式是新手,尝试了很多东西,似乎都不管用。问题太公开了。我的意思是,是否会有嵌套结构,如
(x=1,(a=2,b=3),z=2)
?你到底试过什么?不费吹灰之力就要求编写代码不是常识——数字存储为数字或字符串?@Christopherraris“数字”已经存储为数字或字符串的一部分string@ChristopherHarris很好的解决了为什么要投否决票?所以我可以改进我的答案…我不认为这是一个非常防弹的方法。如果缺少一个值怎么办?(例如
x=
)结果也应该嵌套(正如OP在编辑问题后提到的那样)
[[('x', '1'), ('y', '2'), ('z', '3')],
 [('a', '1')],
 [('m', '4'), ('n', '6'), ('o', '2')]]