我正试图从多个内容不同的漫画书中提取相关信息。但是,只有大约5或6种不同的模式:
例如:
绿灯侠#21
绿灯侠#21(变种封面版)
Dejah Thoris&火星绿人#4(共8人)
Dejah Thoris&火星绿人#4(共8册)(变种封面版)
Macabre One Shot
侦探漫画#21组合包
我想分组捕捉:
我已经开始使用正则表达式搜索字符串了,但是我在制作可靠的可选项时遇到了麻烦,
(?P<name>.*?)\s*?(?P<issue_number>#\d*)\s*?(?P<info>.*)
绝对不完整。任何人都可以给予我任何帮助将不胜感激。
提前致谢!!!
答案 0 :(得分:1)
可选组的问题在于正则表达式引擎并不真正寻找它们;它只检查它们在处理所导致的当前位置的存在。
使用([^#]+)
捕获标题会将引擎置于正确的位置以匹配问题编号(如果存在)。如果您不想在标题末尾添加空格,请改用([^#]*[^#\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')
答案 1 :(得分: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
如果您的输入包含多个此类输入,则应删除^
,$