我正在尝试从内容各异的多本漫画书中提取相关信息。然而,只有大约 5 或 6 种不同的模式被遵循:
例子是:
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
我想分组捕捉:
- 标题(唯一需要的组)
- 发行编号
- 问题总数,例如(共 8 个)
- 所有其他信息,例如(不同封面版)或“组合包”
我开始了一个正则表达式搜索字符串的开始,但是我很难让事情可靠地成为可选的,
(?P<name>.*?)\s*?(?P<issue_number>#\d*)\s*?(?P<info>.*)
绝对不完整。任何人都可以给我的任何帮助将不胜感激。
提前致谢!!!
请您参考如下方法:
可选组的问题在于正则表达式引擎并不真正寻找它们;它只检查它们是否存在于处理导致的当前位置。
使用 ([^#]+) 捕获标题会将引擎置于正确的位置以匹配问题编号(如果存在)。如果您不想在标题末尾使用空格,请改用 ([^#]*[^#\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')
