>>> myUnicode
[u'[X: $1.11] [Y: $3.33] [Z 0/1000]']
我有一个包含上述^的Unicode字符串。我试图提取以下列表:
[X: $1.11]
[Y: $3.33]
将它们存储在不同的变量中。
我的尝试
我的想法是将myUnicode
转换为列表并单独获取值。我知道这是一次糟糕的尝试,但不幸的是我无法想到另一种方法:
myUnicode = [myUnicode]
X = myUnicode[0]
Y = myUnicode[1]
但是得到以下错误:
IndexError: list index out of range
我的理想/预期输出
>>> X
X: $1.11
>>> Y
Y: $3.33
答案 0 :(得分:1)
myUnicode
列表仅包含 1条,即string
,为了达到您想要的效果,您可以将其转换为词典,即:
import re
myUnicode = [u'[X: $1.11] [Y: $3.33] [Z 0/1000]']
matches = re.findall(r"\[(.*?):?\s(.*?)]", myUnicode[0])
final_dict = {}
for x in matches:
final_dict[x[0]] = x[1]
您可以使用以下方式访问值:
print final_dict['X'], final_dict['Y'], final_dict['Z']
# $1.11 $3.33 0/1000
答案 1 :(得分:1)
您需要以某种方式解析数据。使用正则表达式很容易抓住两个括号之间的所有内容。由于[
是正则表达式的特殊字符,因此需要对其进行转义。 \[([^\]]+)
会找到一个左括号,然后将所有内容分组到下一个结束括号。与re.findall
一起使用,您将获得所有“列表”。此代码将它们添加到模块的命名空间
>>> import re
>>> myUnicode = [u'[X: $1.11] [Y: $3.33] [Z 0/1000]']
>>> for code in re.findall(ur'\[([^\]]+)', myUnicode[0]):
... if u':' in code:
... k, v = code.split(u':', 1)
... globals()[str(k.strip())] = v.strip()
...
>>> X
u'$1.11'
>>> Y
u'$3.33'
将它们放在全局命名空间中很奇怪(程序的其余部分如何知道添加的名称)并且可能很危险。非ascii变量或带有其他非法字符的变量不应该去那里。你可以创建自己的dict来持有它们
>>> myvars = {}
>>> for code in re.findall(ur'\[([^\]]+)', myUnicode[0]):
... if u':' in code:
... k, v = code.split(u':', 1)
... myvars[k.strip()] = v.strip()
...
>>> myvars[u"X"]
u'$1.11'
>>>
答案 2 :(得分:0)
如果你想要这个特定的Output
,你可以迭代列表,然后用[:]
剪切字符串:
myunicode = [u'[X: $1.11] [Y: $3.33] [Z 0/1000]']
for data in myunicode:
x = data[1:8]
y = data[12:19]
print x
print y