我正在尝试管理Calibre库。 Calibre使用Python正则表达式来操纵数据库字段。特别是,您可以为sub()方法指定“pattern”和“repl”参数。但这就是你所能做的,没有其他编码。我目前的问题是,如果我的组表达式不匹配,Calibre会报告“无法匹配的组”错误,并拒绝继续。
我是否可以创建一个“始终匹配”的组,但如果它真的不存在则包含空字符串?
如果找到子字符串,我想用标题中的子字符串替换字段,如果不是,则返回空字符串。我目前有混合标题,如:
Anne McCaffrey - Pern 10 - The Renegades of Pern
Generation Warriors
The Mystery of Ireta: Dinosaur Planet & Dinosaur Planet Survivors
Anne McCaffrey - Tsw 7 - Ship That Returned
我想从第一个例子中选择“Pern 10”,从第四个例子中选择“Tsw 7”,然后将它们写入系列字段。我怎么能这样做?
我目前的错误表达是
(((P<author>[^-]*?)- )?((?P<series>\w+)\W*(?P<series_index>\d*)\s-))?(?P<title>.*)
目前我想要的唯一领域是
\g<series>
感谢您的任何想法!
答案 0 :(得分:1)
如果我正确理解要求,听起来你应该能够写下:
^(?:(?! - ).)*(?: - )?(?P<series>(?:(?! - ).)*)
如果没有空格 - 连字符空格,则初始^(?:(?! - ).)*
部分将吞下第一个空格 - 连字符空间之前的所有内容 - 或者只是吞下所有内容。
(?: - )?
部分将吞下第一个空格 - 连字符空格(如果存在),或者不显示任何内容。
(?:(?! - ).)*
内的(?P<series>...)
部分将吞下尚未吞下的所有部分,直到第二个空格 - 连字符空格(或字符串结尾,如果没有第二个空格 - 连字符空间被发现)。如果已经吞下了所有东西,那么这只是空字符串。
换句话说,以上大致相当于:
@parts = split $title, / - /, 3;
$series = ((@parts > 1) ? $parts[1] : '');
这对你有用吗?