Python正则表达式否定元字符

时间:2011-11-25 07:45:24

标签: python regex regex-negation

Python元字符否定。

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

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

所以我试图找到一个正则表达式(我可以优先编译),在我的脑海中看起来像(^[\d4^]),因为我想要一组的4个数字它们周围有方括号。我正在使用括号以希望绑定它,以便我可以使用类似[\1]的内容重命名。

1 个答案:

答案 0 :(得分:9)

如果要检查模式周围的事物,可以使用 lookahead lookbehind 断言。这些不是比赛的一部分,而是说出你希望在它周围找到(或找不到)的东西。

由于我们不需要括号,我们需要使用否定 lookbehind和lookahead。

否定前瞻看起来像(?!...),如果下一个...不匹配则匹配。同样,负面的lookbehind看起来像(?<!...),如果之前没有...则匹配。

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

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

  • [ - (?<!\[)
  • 的负面观察
  • 四位数 - \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'