2011-03-14 59 views
3

解析我无法找到字符串解析()方法的任何文档。有没有很好的参考?我想解析以下内容:字符串与Python

frame 0 rows {3 2 3 3 3 3 2 3 2 3 3 3 2 3 2 3 4 3 3 4 3 2 2 3 3 3 2 2 2 2 3 3 3 2 3 2 3 3 3 3 4 3 4 3 3 3 3 4 3 2 3 3 3 3 2 2 2 4 4 3 3 3 3 3 4 4 4 3 2 4 3 4 3 3 3 4 3 3 4 3 3 4 4 3 3 3 4 4 3 4 3 3 3 3 3 4} columns {2 3 2 3 3 3 4 3 3 2 3 2 2 2 3 2 3 3 2 2 2 3 3 3 3 2 3 3 3 2 3 3 2 2 2 3 3 4 3 3 3 3 3 3 3 3 2 3 3 3 3 4 3 2 3 2 3 3 3 3 3 2 2 3 3 3 3 2 3 3 3 3 3 3 3 3 3 4 3 3 3 3 3 4 3 3 4 3 4 4 4 3 4 4 4 4 4 4 3 3 4 4 3 4 4 4 4 3 3 3 4 4 3 4 4 3 3 4 3 5 5 5 5 4 5 4 4 4} 

变成两个int列表。

+0

这不是什么'string.parse()'被设计用于(它在内部使用的String.Format的'部分( )')。请尝试查看're'正则表达式库来代替。 – Amber

回答

5

Python字符串解析()将不会帮助你在这里(它有一个很不起眼的使用)。在这种情况下,我会以明显的方式去做:用正则表达式!如果 'S' 是你的字符串以上,

import re 
lists = [ 
    [int(i) for i in match.split()] 
    for match in re.findall(r'{(.*?)}', s) 
] 

print lists 
1
>>> a="frame 0 rows {3 2 3 3 3 3 2 3 2 3 3 3 2 3 2 3 4 3 3 4 3 2 2 3 3 3 2 2 2 2 3 3 3 2 3 2 3 3 3 3 4 3 4 3 3 3 3 4 3 2 3 3 3 3 2 2 2 4 4 3 3 3 3 3 4 4 4 3 2 4 3 4 3 3 3 4 3 3 4 3 3 4 4 3 3 3 4 4 3 4 3 3 3 3 3 4} columns {2 3 2 3 3 3 4 3 3 2 3 2 2 2 3 2 3 3 2 2 2 3 3 3 3 2 3 3 3 2 3 3 2 2 2 3 3 4 3 3 3 3 3 3 3 3 2 3 3 3 3 4 3 2 3 2 3 3 3 3 3 2 2 3 3 3 3 2 3 3 3 3 3 3 3 3 3 4 3 3 3 3 3 4 3 3 4 3 4 4 4 3 4 4 4 4 4 4 3 3 4 4 3 4 4 4 4 3 3 3 4 4 3 4 4 3 3 4 3 5 5 5 5 4 5 4 4 4}" 

>>> import ast 
>>> import re 
>>> for match in re.finditer("\{([\d ]+)\}",a): 
    integers=match.groups()[0] 
    l=ast.literal_eval(integers.replace(" ",",")) 
    print l 


(3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 3, 3, 2, 3, 2, 3, 4, 3, 3, 4, 3, 2, 2, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 2, 3, 2, 3, 3, 3, 3, 4, 3, 4, 3, 3, 3, 3, 4, 3, 2, 3, 3, 3, 3, 2, 2, 2, 4, 4, 3, 3, 3, 3, 3, 4, 4, 4, 3, 2, 4, 3, 4, 3, 3, 3, 4, 3, 3, 4, 3, 3, 4, 4, 3, 3, 3, 4, 4, 3, 4, 3, 3, 3, 3, 3, 4) 
(2, 3, 2, 3, 3, 3, 4, 3, 3, 2, 3, 2, 2, 2, 3, 2, 3, 3, 2, 2, 2, 3, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 2, 2, 2, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 4, 3, 2, 3, 2, 3, 3, 3, 3, 3, 2, 2, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 4, 3, 3, 4, 3, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 3, 3, 4, 4, 3, 4, 4, 4, 4, 3, 3, 3, 4, 4, 3, 4, 4, 3, 3, 4, 3, 5, 5, 5, 5, 4, 5, 4, 4, 4) 

我从来没有听说过一个分析方法的实际分析中,你问路的字符串。但是,解析该字符串并不困难。这是如何做到这一点。

+0

你为什么在这里使用'ast'? –

+1

@Senthil:没有充分的理由在这种特殊情况下使用它。只要像Jesse的答案那样调用int()就可能更有效率,也是正确的做法。 –

+0

@funktu:感谢您的回答无论如何,因为我仍然不熟悉AST,这是很好的它的使用的一些例子。 –

0
m_string = "frame 0 rows {3 2 3 3 3 3 2 3 2 3 3 3 2 3 2 3 4 3 3 4 3 2 2 3 3 3 2 2 2 2 3 3 3 2 3 2 3 3 3 3 4 3 4 3 3 3 3 4 3 2 3 3 3 3 2 2 2 4 4 3 3 3 3 3 4 4 4 3 2 4 3 4 3 3 3 4 3 3 4 3 3 4 4 3 3 3 4 4 3 4 3 3 3 3 3 4} columns {2 3 2 3 3 3 4 3 3 2 3 2 2 2 3 2 3 3 2 2 2 3 3 3 3 2 3 3 3 2 3 3 2 2 2 3 3 4 3 3 3 3 3 3 3 3 2 3 3 3 3 4 3 2 3 2 3 3 3 3 3 2 2 3 3 3 3 2 3 3 3 3 3 3 3 3 3 4 3 3 3 3 3 4 3 3 4 3 4 4 4 3 4 4 4 4 4 4 3 3 4 4 3 4 4 4 4 3 3 3 4 4 3 4 4 3 3 4 3 5 5 5 5 4 5 4 4 4}" 

import re 

print [[ int(i) for i in x.split(" ")] for x in [ match for match in re.findall("\{([\d ]+)\}", m_string)] ] 

结果:

[3,2,3,3,3,3,2,3,2,3, 3,3, 2,3,2,3,4,3,3,4,3,2,2,3,3, 3,2,2,2,2,3,3,3,2, 3,2,3,3, 3,3,4,3,4,3,3,3,3,4,3,2,3, 3,3,3,2,2,2,4, 4,3,3,3,3,3, 4,4,4,3,2,4,3,4,3,3,3,4,3, 3,4,3,3,4, 4,3,3,4,4,3,4, 3,3,3,3,3,4],[2,3,2,3,3,3, 4,3,3,2,3,2,2,2,3,2,3, 3,2, 2,2,3,3,3,3,2,3,3,3,2,3,3, 2,2,2,3,3,4,3,3,3, 3,3,3,3, 3,2,3,3,3,3,4,3,2,3,2,3,3, 3,3,3,2,2,3,3, 3,3,2,3,3,3, 3,3,3,3,3,3,4,3,3,3,3,3,4, 3,3,4,3,4, 4,4,3,4,4,4,4,4, 4,3,3,4,4,3,4,4,4,4,3,3,3, 4,4,3, 4,4,3,3,4,3,5,5,5,5, 4,5,4,4,4]]

1

对于这样很好地结构化的数据,pyparsing可能比你更需要,但它很好对于一个很好的教程例子ES:

from pyparsing import * 

s = "frame 0 rows {3 2 3 3 3 3 2 3 2 3 3 3 2 3 2 3 4 3 3 4 3 2 2 3 3 3 2 2 2 2 3 3 3 2 3 2 3 3 3 3 4 3 4 3 3 3 3 4 3 2 3 3 3 3 2 2 2 4 4 3 3 3 3 3 4 4 4 3 2 4 3 4 3 3 3 4 3 3 4 3 3 4 4 3 3 3 4 4 3 4 3 3 3 3 3 4} columns {2 3 2 3 3 3 4 3 3 2 3 2 2 2 3 2 3 3 2 2 2 3 3 3 3 2 3 3 3 2 3 3 2 2 2 3 3 4 3 3 3 3 3 3 3 3 2 3 3 3 3 4 3 2 3 2 3 3 3 3 3 2 2 3 3 3 3 2 3 3 3 3 3 3 3 3 3 4 3 3 3 3 3 4 3 3 4 3 4 4 4 3 4 4 4 4 4 4 3 3 4 4 3 4 4 4 4 3 3 3 4 4 3 4 4 3 3 4 3 5 5 5 5 4 5 4 4 4}" 

LBRACE,RBRACE = map(Suppress,"{}") 
integer = Word(nums).setParseAction(lambda t:int(t[0])) 

line = ("frame" + integer("frame") + 
     "rows" + LBRACE + ZeroOrMore(integer)("rows") + RBRACE + 
     "columns" + LBRACE + ZeroOrMore(integer)("columns") + RBRACE) 

data = line.parseString(s) 
print data.frame 
print data.rows[:10] 
print data.columns[:10] 

打印:

0 
[3, 2, 3, 3, 3, 3, 2, 3, 2, 3] 
[2, 3, 2, 3, 3, 3, 4, 3, 3, 2]