漫画书标题的可选正则表达式组(python)

时间:2013-06-07 04:23:26

标签: python regex

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

例如:

  

绿灯侠#21

     

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

     

Dejah Thoris&火星绿人#4(共8人)

     

Dejah Thoris&火星绿人#4(共8册)(变种封面版)

     

Macabre One Shot

     

侦探漫画#21组合包

我想分组捕捉:

  1. 标题(唯一必需的组)
  2. 发行编号
  3. 问题总数,例如(8)
  4. 所有其他信息,例如(Varient Cover Edition)或'Combo Pack'
  5. 我已经开始使用正则表达式搜索字符串了,但是我在制作可靠的可选项时遇到了麻烦,

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

    绝对不完整。任何人都可以给予我任何帮助将不胜感激。

    提前致谢!!!

2 个答案:

答案 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

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