我有一本叫dicitionario1的字典。我需要替换dicionario[chave][1]的内容,它是一个列表,用于列表lista_atributos。lista_atribtutos使用dicionario[chave][1]的内容获取列表,其中:
"(#"和")"外,所有信息都由"(#"进行区分。在这种情况下,它应该创建一个列表,其中包含这些字符之间的内容(也由","分隔)。它可以找到“(#”)的一个或多个条目,我需要处理其中的每一个条目。虽然这可能很简单,但我仍然坚持使用以下代码:
dicionario1 = {'#998' : [['IFCPROPERTYSET'],["'0siSrBpkjDAOVD99BESZyg',#41,'Geometric Position',$,(#977,#762,#768,#754,#753,#980,#755,#759,#757)"]],
'#1000' : [['IFCRELDEFINESBYPROPERTIES'],["'1dEWu40Ab8zuK7fuATUuvp',#41,$,$,(#973,#951),#998"]]}
for chave in dicionario1:
lista_atributos = []
ini = 0
for i in dicionario1[chave][1][0][ini:]:
if i == '(' and dicionario1[chave][1][0][dicionario1[chave][1][0].index(i) + 1] == '#':
ini = dicionario1[chave][1][0].index(i) + 1
fim = dicionario1[chave][1][0].index(')')
lista_atributos.append(dicionario1[chave][1][0][:ini-2].split(','))
lista_atributos.append(dicionario1[chave][1][0][ini:fim].split(','))
lista_atributos.append(dicionario1[chave][1][0][fim+2:].split(','))
print lista_atributos结果:
[["'1dEWu40Ab8zuK7fuATUuvp'", '#41', '$', '$'], ['#973', '#951'], ['#998']]
[["'0siSrBpkjDAOVD99BESZyg'", '#41', "'Geometric Position'", '$'], ['#977', '#762', '#768', '#754', '#753', '#980', '#755', '#759', '#757'], ['']]不幸的是,我可以弄清楚如何在dictionario1[chave][1][0]上迭代以获得这个结果:
[["'1dEWu40Ab8zuK7fuATUuvp'"], ['#41'], ['$'], ['$'], ['#973', '#951'], ['#998']]
[["'0siSrBpkjDAOVD99BESZyg'", ['#41'], ["'Geometric Position'"], ['$'], ['#977', '#762', '#768', '#754', '#753', '#980', '#755', '#759', '#757']]我需要结果中的"["'1dEWu40Ab8zuK7fuATUuvp'", '#41', '$', '$']...",也可以转换为["'1dEWu40Ab8zuK7fuATUuvp'"], ['#41'], ['$'], ['$']...
另外,如果我将"Geometric Position"修改为"(Geometric Position)",结果如下:
[["'1dEWu40Ab8zuK7fuATUuvp'", '#41', '$', '$'], ['#973', '#951'], ['#998']]解决方案:(多亏了罗布·瓦茨)
import re
dicionario1 =["'0siSrBpkjDAOVD99BESZyg',#41,'(Geometric) (Position)',$,(#977,#762,#768,#754,#753,#980,#755,#759,#757)"]
dicionario1 = re.findall('\([^)]*\)|[^,]+', dicionario1[0])
for i in range(len(dicionario1)):
if dicionario1[i].startswith('(#'):
dicionario1[i] = dicionario1[i][1:-1].split(',')
else:
pass
print dicionario1
["'0siSrBpkjDAOVD99BESZyg'", '#41', "'(Geometric) (Position)'", '$', ['#977', '#762', '#768', '#754', '#753', '#980', '#755', '#759', '#757']]发布于 2014-05-12 17:01:53
我在代码中看到的一个问题是index的使用。
ini = dicionario1[chave][1][0].index(i) + 2
fim = dicionario1[chave][1][0].index(')')index返回字符第一次出现的索引。因此,如果字符串中有两个(,那么两次都会给出第一个字符串的索引,这就是为什么在您的示例中正确地获得了['2.1', '2.2', '2.3'],但也有'(#5.1', '5.2', '5.3)'。
您可以通过为index方法指定一个起始索引来解决这个问题,但我建议采用不同的策略。如果在解析的字符串中没有逗号,则可以使用相当简单的regex查找所有组:
'\([^)]*\)|[^,]+'这将发现括号内的所有内容,以及不包含逗号的所有内容。例如:
>>> import re
>>> teststr = "'1',$,#41,(#10,#5)"
>>> re.findall('\([^)]*\)|[^,]+', teststr)
["'1'", '$', '#41', '(#10,#5)']这样,您就可以将所有的东西适当地分组。您仍然需要对每个条目进行一些处理,但这应该相当简单。
在处理过程中,startswith方法应该是有帮助的。例如:
>>> '(something)'.startswith('(')
True
>>> '(something)'.startswith('(#')
False
>>> '(#1,#2,#3)'.startswith('(#')
True这将使您很容易区分(...)和(#...)。如果(...)中有逗号,那么在使用regex之后,始终可以在逗号上拆分。
https://stackoverflow.com/questions/23614042
复制相似问题