2

我正在尝试从具有不同内容的多个漫画书标题中提取相关信息。但是,只有大约 5 或 6 种不同的模式被遵循:

例子是:

绿灯侠 #21

绿灯侠 #21(变体封面版)

Dejah Thoris 和火星的绿人 #4 (of 8)

Dejah Thoris & Green Men Of Mars #4(共 8 个)(变体封面版)

可怕的一枪

侦探漫画 #21 组合包

我想分组捕获:

  1. 标题(唯一需要的组)
  2. 发行数量
  3. 问题总数,例如(共 8 个)
  4. 所有其他信息,例如(变体封面版)或“组合包”

我有一个正则表达式搜索字符串的开头,但是在使事情可靠地可选时遇到了麻烦,

(?P<name>.*?)\s*?(?P<issue_number>#\d*)\s*?(?P<info>.*)

肯定是不完整的。任何人都可以给我的任何帮助将不胜感激。

提前致谢!!!

4

2 回答 2

2

可选组的问题在于正则表达式引擎并没有真正寻找它们。它只检查它们是否存在于处理导致的当前位置。

使用([^#]+)捕获标题将引擎置于正确的位置以匹配问题编号(如果存在)。如果您不想在标题末尾出现空格,请([^#]*[^#\s])\s*改用。

import re

strings = ['Green Lantern #21', 
    'Green Lantern #21 (Variant Cover Edition)', 
    'Dejah Thoris & Green Men Of Mars #4 (of 8)', 
    'Dejah Thoris & Green Men Of Mars #4 (of 8) (Variant Cover Edition)', 
    'Macabre One Shot', 
    'Detective Comics #21 Combo Pack']

for s in strings:
    print re.match(r'([^#]*[^#\s])\s*(?:#(\d+)\s*)?(?:\(of (\d+)\)\s*)?(.+)?', s).groups()

印刷

('Green Lantern', '21', None, None)
('Green Lantern', '21', None, '(Variant Cover Edition)')
('Dejah Thoris & Green Men Of Mars', '4', '8', None)
('Dejah Thoris & Green Men Of Mars', '4', '8', '(Variant Cover Edition)')
('Macabre One Shot', None, None, None)
('Detective Comics', '21', None, 'Combo Pack')
于 2013-06-07T18:48:04.393 回答
0

你可以试试这个正则表达式

^(?P<name>.+?)(\s+(?P<issue_number>#\d+))?(\s+(?P<issues>\(of\s*\d+\)))?(\s+(?P<other>\(Variant Cover Edition\)|Combo Pack))?$

解释

^  # beginning of string
(?P<name>.+?)   # Captures the name
(\s+(?P<issue_number>#\d+))?   # captures the issue number optionally
(\s+(?P<issues>\(of\s*\d+\)))?   # captures the number of issues optionally
(\s+(?P<other>\(Variant Cover Edition\)|Combo Pack))?   # captures other info optionally
$ # end of string

如果您的输入包含多个此类输入,则应删除^,$

于 2013-06-07T04:57:04.667 回答