使用re module sub()创建匹配字符串或空字符串的匹配组?

时间:2012-03-18 18:24:47

标签: python regex

我正在尝试管理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>

感谢您的任何想法!

1 个答案:

答案 0 :(得分:1)

如果我正确理解要求,听起来你应该能够写下:

^(?:(?! - ).)*(?: - )?(?P<series>(?:(?! - ).)*)

如果没有空格 - 连字符空格,则初始^(?:(?! - ).)*部分将吞下第一个空格 - 连字符空间之前的所有内容 - 或者只是吞下所有内容。

(?: - )?部分将吞下第一个空格 - 连字符空格(如果存在),或者不显示任何内容。

(?:(?! - ).)*内的(?P<series>...)部分将吞下尚未吞下的所有部分,直到第二个空格 - 连字符空格(或字符串结尾,如果没有第二个空格 - 连字符空间被发现)。如果已经吞下了所有东西,那么这只是空字符串。

换句话说,以上大致相当于:

@parts = split $title, / - /, 3;
$series = ((@parts > 1) ? $parts[1] : '');

这对你有用吗?