我是 python/django 新手,我正在尝试从我的抓取工具中找出更有效的信息。目前,抓取工具获取漫画书标题列表,并将其正确分为三部分(发布日期、原始日期和标题)的 CSV 列表。然后,我将当前日期和标题传递到数据库的不同部分,这是我在加载器脚本中执行的操作(将 mm/dd/yy 转换为 yyyy-mm-dd,保存到“pub_date”列,标题转到“title”柱子)。
常见的字符串可能如下所示:
10/12/11|10/12/11|Stan Lee's Traveler #12 (10 Copy Incentive Cover)
我成功地获取了日期,但标题比较棘手。在这种情况下,我理想地希望在第二个“|”之后填充三个不同的列。标题应该转到“title”,即一个charfield。数字 12(在“#”之后)应该进入 DecimalField“issue_num”,而“()”之间的所有内容都应该进入“Special”字符域。我不知道如何进行这种严格的解析。
有时,有多个 #(特别是一个漫画被描述为一个 bundle ,“包含问题 #90-#95”),并且有几个具有多个“()”组(例如“背叛地球” 《猩球崛起》#1(共 4 张)(25 份激励封面) )
开始解决这个问题的好方法是什么?对于更复杂的行,我对 If/else 语句的了解很快就崩溃了。我怎样才能有效地(如果可能的话)Python式地解析这些行并分割它们,以便以后可以将它们插入数据库中的正确位置?
最佳答案
使用regular expression模块re
。例如,如果您的示例记录的第三个 |
分隔字段位于变量 s
中,那么您可以这样做
match = re.match(r"^(?P<title>[^#]*) #(?P<num>[0-9]+) \((?P<special>.*)\)$", s)
title = match.groups('title')
issue = match.groups('num')
special = match.groups('special')
如果缺少字段,您将在最后三行中收到 IndexError
。调整 RE,直到它解析出您想要的所有内容。
关于python - Python 上的不规则字符串解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7698034/