【问题标题】:Regex - Match last occurrence of parentheses正则表达式 - 匹配最后出现的括号
【发布时间】:2021-10-15 10:33:54
【问题描述】:

在下面的字符串中,我试图获取子字符串(2005, Penguin Classics) 子字符串。

Marshall B. Rosenberg 博士 - Anger_ Beyond 的惊人目的 愤怒管理_寻找礼物(非暴力沟通指南) (2005,企鹅经典)AAA.pdf

我这样做是为了将子字符串更改为 (2005)。

以下是我当前的解决方案,但它同时匹配 (Nonviolent Communication Guides)(2005, Penguin Classics)。有关如何解决此问题的任何想法?

import re

parentheses_pattern = "\(([^)]+)\)*$"
reg = re.search(parentheses_pattern, filename)
year = reg.group()
year = year[:5]+")"
filename = re.sub(parentheses_pattern,year,filename)

【问题讨论】:

    标签: python regex pattern-matching regex-lookarounds regexp-replace


    【解决方案1】:

    这可能有用吗?

    \(\d+, .*\)
    

    测试正则表达式的好地方是:https://rubular.com/

    以防万一它派上用场! :)

    【讨论】:

    • 谢谢!如果第一个子字符串有前导数字,这不会失败吗?
    • 这不是因为正则表达式中的逗号和空格。所以即使是:[...](23 Nonviolent Communication Guides) (2005, Penguin Classics)[...] 它仍然会选择你想要的子字符串。
    【解决方案2】:

    也许这会有所帮助:

    r"\(([^\)]+)\)[^\(]*$"
    

    【讨论】:

    • 谢谢!开头的 r 字符有什么用?
    • 顺便说一句,它无法正常工作,因为它会在末尾截断文件扩展名 (.pdf)
    • 我认为目标是匹配最后出现的括号中的内容——这就是模式的作用。不管怎样,你可以试试r"\(([^\)]+)\)(?=[^\(]*$)"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多