2014-09-21 32 views
0

我婉解析器这个unicode字符串列表到表:如何解析器这个unicode字符串列表

[u'$760,507,625 (USA) (18 November 2010)', u'$760,505,847 (USA) (14 November 2010)', u'$760,462,559 (USA) (7 November 2010)', u'$760,410,799 (USA) (31 October 2010)', 

所以结果我想要的是:

[[760507625, 11, 18, 2010, 'USA'], 
[760505847, 11, 7, 2010, 'USA'], 
    .... 
] 

正如你所看到的,格式将[钱,月,日,年,国家]

也许你可以提供我可以处理这个问题的工具。 我能让我清楚吗?非常感谢!

+1

它总是重要的是要告诉人们[你已经试过(http://whathaveyoutried.com/),包括任何片段失败的尝试,使他们能够了解什么途径你错过了。这很重要,因为它激励人们回答问题,这很重要,因为它可以让问题更容易提供高质量的相关答案。就目前的问题来看,这尚未实现。如果您编辑问题,可能会阻止问题被关闭,您获得的答案的数量,质量和清晰度也会提高。 – Veedrac 2014-09-21 04:23:06

+0

是的。你是对的。我是Python的新手。所以我不知道这次要尝试什么 – Zizhao 2014-09-21 16:53:21

回答

1

我会处理这个问题的常用方法是使用正则表达式来抓取每行中的字段,然后每行将一行或两行转换为所需的格式。这并非万无一失 - 例如,如果某行有一个拼写错误的月份,那么它就会崩溃,但对于大多数即席任务来说,这足够了。

#!/usr/bin/env python2.7 

import re 

data = [u'$760,507,625 (USA) (18 November 2010)', 
     u'$760,505,847 (USA) (14 November 2010)', 
     u'$760,462,559 (USA) (7 November 2010)', 
     u'$760,410,799 (USA) (31 October 2010)', 
     'blah'] 

RE_DATA = re.compile(r'^\$([0-9,]+) \(([A-Z]+)\) \(([0-9]+) ([A-Za-z]+) ([0-9]+)\)$') 

MONTHS = { 
    'January': 1, 
    'February': 2, 
    'March': 3, 
    'April': 4, 
    'May': 5, 
    'June': 6, 
    'July': 7, 
    'August': 8, 
    'September': 9, 
    'October': 10, 
    'November': 11, 
    'December': 12 
} 

for entry in data: 
    match = RE_DATA.match(entry) 
    if match is None: 
     print 'Error! %r did not match pattern' % entry 
     continue 

    amount, country, day, month, year = match.groups() 
    amount = int(amount.replace(',', '')) 
    country = str(country) 
    day = int(day) 
    month = MONTHS[month] 
    year = int(year) 

    print [amount, month, day, year, country] 

打印:

[760507625, 11, 18, 2010, 'USA'] 
[760505847, 11, 14, 2010, 'USA'] 
[760462559, 11, 7, 2010, 'USA'] 
[760410799, 10, 31, 2010, 'USA'] 
Error! 'blah' did not match pattern 
+0

非常感谢!这正是我需要的。 – Zizhao 2014-09-21 16:52:45

+0

FWIW,月份名称字典等的构建更容易,您可以从'calendar.month_name'获得月份名称列表,它也有星期几名称列表,并且月份和星期几名称都可以缩写形式提供。你也可以通过'datetime()。strftime()'来获得这样的列表,但是使用日历模块更清洁,恕我直言。 (我认为日历使用日期时间)。这两个模块都具有本地感知功能,可以很方便。 – 2014-09-21 17:29:49