Skip to main content
 首页 » 编程设计

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

2025年05月04日27jirigala

我正在尝试从内容各异的多本漫画书中提取相关信息。然而,只有大约 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

我想分组捕捉:

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

我开始了一个正则表达式搜索字符串的开始,但是我很难让事情可靠地成为可选的,

(?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')