Python 使用re module sub()创建匹配字符串或空字符串的匹配组?
我正在设法管理一个有水平的图书馆。Calibre使用Python正则表达式来操作数据库字段。特别是,可以为sub()方法指定“pattern”和“repl”参数。但这就是你所能做的,没有其他编码。我当前的问题是,如果我的组表达式不匹配,Calibre将报告“unmatched group”错误,并拒绝继续 我是否可以创建一个“始终匹配”但包含空字符串(如果确实不存在)的组 如果找到子字符串,我想用标题中的子字符串替换字段,如果找不到,则用空字符串替换字段。我目前的头衔不一,比如:Python 使用re module sub()创建匹配字符串或空字符串的匹配组?,python,regex,Python,Regex,我正在设法管理一个有水平的图书馆。Calibre使用Python正则表达式来操作数据库字段。特别是,可以为sub()方法指定“pattern”和“repl”参数。但这就是你所能做的,没有其他编码。我当前的问题是,如果我的组表达式不匹配,Calibre将报告“unmatched group”错误,并拒绝继续 我是否可以创建一个“始终匹配”但包含空字符串(如果确实不存在)的组 如果找到子字符串,我想用标题中的子字符串替换字段,如果找不到,则用空字符串替换字段。我目前的头衔不一,比如: Anne M
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
样式,但不允许递归。太棒了!我只需要添加一个尾随“*”就可以让它工作得足够好。谢谢我不认为它真的使用了Perlre
模块,是吗?我认为它只是使用Perl正则表达式。您正在考虑Pythonre
模块吗?我看到您正在使用名为capture语法的Python,Perl确实支持它,尽管根据我下面的评论,我自己更喜欢Java语法。是一个Python应用程序。我修复了描述和标记。我认为它没有真正使用Perlre
模块,是吗?我认为它只是使用Perl正则表达式。您正在考虑Pythonre
模块吗?我看到您正在使用名为capture语法的Python,Perl确实支持它,尽管根据我下面的评论,我自己更喜欢Java语法。是一个Python应用程序。我修正了描述和标签。