从unicode字符串中的列表中提取信息

时间:2017-04-22 15:36:22

标签: python python-2.7 list unicode

>>> 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

3 个答案:

答案 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

Demo

答案 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