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

Python 使用re module sub()创建匹配字符串或空字符串的匹配组?,python,regex,Python,Regex,我正在设法管理一个有水平的图书馆。Calibre使用Python正则表达式来操作数据库字段。特别是,可以为sub()方法指定“pattern”和“repl”参数。但这就是你所能做的,没有其他编码。我当前的问题是,如果我的组表达式不匹配,Calibre将报告“unmatched group”错误,并拒绝继续 我是否可以创建一个“始终匹配”但包含空字符串(如果确实不存在)的组 如果找到子字符串,我想用标题中的子字符串替换字段,如果找不到,则用空字符串替换字段。我目前的头衔不一,比如: Anne M

我正在设法管理一个有水平的图书馆。Calibre使用Python正则表达式来操作数据库字段。特别是,可以为sub()方法指定“pattern”和“repl”参数。但这就是你所能做的,没有其他编码。我当前的问题是,如果我的组表达式不匹配,Calibre将报告“unmatched group”错误,并拒绝继续

我是否可以创建一个“始终匹配”但包含空字符串(如果确实不存在)的组

如果找到子字符串,我想用标题中的子字符串替换字段,如果找不到,则用空字符串替换字段。我目前的头衔不一,比如:

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
我想从第一个示例中选择“pern10”,从第四个示例中选择“tsw7”,并将它们写入series字段。我该怎么做

我现在的错误表达是

(((P<author>[^-]*?)- )?((?P<series>\w+)\W*(?P<series_index>\d*)\s-))?(?P<title>.*)
((P[^-]*?)-)((P\w+)\w*(?P\d*)\s-)(?P.*))
目前我唯一想要的领域是

\g<series>
\g

谢谢你的建议

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

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

这对你有用吗?

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

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

这对你有用吗?

拆分方法比任何使用更复杂模式的方法都要好得多。我相信你知道这一点,但我发现
(?p…)
语法写得更清晰,如
(?…)
。命名捕获组有许多与其他语言的正则表达式库兼容的语法变体,但我已经统一了
(?…)
\k
样式对。加上用于模式递归的
(?&name)
的“regex子程序”调用语法。Java 7模式库使用
(?…)
\k
样式,但不允许递归。太棒了!我只需要添加一个尾随“*”就可以让它工作得足够好。谢谢
split
方法比任何使用更复杂模式的方法都要好得多。我相信您知道这一点,但我发现
(?P…)
语法写得更清晰,如
(?…)
。命名捕获组有许多与其他语言的正则表达式库兼容的语法变体,但我已经统一了
(?…)
\k
样式对。加上用于模式递归的
(?&name)
的“regex子程序”调用语法。Java 7模式库使用
(?…)
\k
样式,但不允许递归。太棒了!我只需要添加一个尾随“*”就可以让它工作得足够好。谢谢我不认为它真的使用了Perl
re
模块,是吗?我认为它只是使用Perl正则表达式。您正在考虑Python
re
模块吗?我看到您正在使用名为capture语法的Python,Perl确实支持它,尽管根据我下面的评论,我自己更喜欢Java语法。是一个Python应用程序。我修复了描述和标记。我认为它没有真正使用Perl
re
模块,是吗?我认为它只是使用Perl正则表达式。您正在考虑Python
re
模块吗?我看到您正在使用名为capture语法的Python,Perl确实支持它,尽管根据我下面的评论,我自己更喜欢Java语法。是一个Python应用程序。我修正了描述和标签。