【问题标题】:Python regex negating metacharactersPython正则表达式否定元字符
【发布时间】:2011-11-25 07:45:23
【问题描述】:

Python 元字符否定。

在网上搜索并写了一些不同的语法之后,我没有想法了。

试图重命名一些文件。他们的标题中有一年,例如[2002]。 有些没有括号,我想纠正一下。

所以我试图找到一个在我看来类似于(^[\d4^]) 的正则表达式(我可以更好地编译),因为我想要一组 有正方形的 4 个数字他们周围的括号。我正在使用方括号希望绑定它,以便我可以使用类似[\1] 的东西重命名。

【问题讨论】:

    标签: python regex regex-negation


    【解决方案1】:

    如果你想检查模式周围的东西,你可以使用 lookaheadlookbehind 断言。这些并不构成匹配的一部分,而是说明您希望在它周围找到(或未找到)的内容。

    由于我们不想要括号,我们需要使用 negative 后向和前瞻。

    如果... 没有出现,则负前瞻看起来像这样(?!...)。同样,否定的后视看起来像这样 (?<!...) 并且如果 ... 之前没有出现则匹配。

    我们的示例稍微复杂一些,因为我们使用了[],它们本身在正则表达式中是有意义的,所以我们必须用\ 转义它们。

    所以我们可以构建如下模式:

    • [ - (?<!\[) 的负面回溯
    • 四位数字 - \d{4}
    • ] - (?!\]) 的负前瞻

    这为我们提供了以下 Python 代码:

    >>> import re
    >>> r = re.compile("(?<!\[)\d{4}(?!\])")
    >>> r.match(" 2011 ")
    >>> r.search(" 2011 ")
    <_sre.SRE_Match object at 0x10884de00>
    >>> r.search("[2011]")
    

    要重命名,您可以在编译的模式上使用the re.sub functionsub 函数。要使其正常工作,您需要在一年中添加一组额外的括号以将其标记为一个组。

    此外,在指定替换时,您将组称为 \1,因此您必须转义 \ 或使用原始字符串。

    >>> r = re.compile("(?<!\[)(\d{4})(?!\])")
    >>> name = "2011 - This Year"
    >>> r.sub(r"[\1]",name)
    '[2011] - This Year'
    

    【讨论】:

    • 哇,谢谢。出现 2 个 [total noob] 问题,但也许我应该开始新线程.. 为什么 ">>>" 提示以及 "at 0x10884de00" 告诉我什么?
    • @Dee - 出现&gt;&gt;&gt; 提示是因为我在 Python REPL 中测试了我的代码;在不带参数的命令行中键入python,您可以在交互式shell 中一次运行一行Python 代码。 0x10884de00 的值不会告诉你任何事情。重要的是 r.search(" 2011 ") 返回了一个匹配对象,所以有一个匹配,但 r.search("[2011]") 什么也没返回,所以没有匹配。
    • 谢谢您,先生。我很高兴地报告,我的第一个 python 程序现在有了翅膀,并且根据我的搜索/替换标准正确地重命名了 100 个文件。非常感谢!嗯,我似乎无法@用户名
    猜你喜欢
    • 1970-01-01
    • 2017-03-12
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2020-12-18
    • 1970-01-01
    相关资源
    最近更新 更多