我有一个名为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']]
解决方案:(感谢Rob Watts)
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']]
答案 0 :(得分:0)
我在您的代码中看到的一个问题是使用index
:
ini = dicionario1[chave][1][0].index(i) + 2
fim = dicionario1[chave][1][0].index(')')
index
返回角色第一个出现的索引。因此,如果您的字符串中有两个(
,则两次都会为您提供第一个索引。那个(以及您的break
声明)就是为什么在您的示例中您已正确获得['2.1', '2.2', '2.3']
但也有'(#5.1', '5.2', '5.3)'
。
您可以通过为index
方法指定起始索引来解决此问题,但我建议采用不同的策略。如果您在解析后的字符串中没有逗号,则可以使用相当简单的正则表达式来查找所有组:
'\([^)]*\)|[^,]+'
这将找到括号内的所有内容以及不包含逗号的所有内容。例如:
>>> 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
这样您就可以轻松区分(...)
和(#...)
。如果(...)
中有逗号,则在您使用正则表达式后,您可以随时使用逗号分隔。