Python元字符否定。
在搜索网并写出一些不同的语法之后,我就没有想法了。
尝试重命名某些文件。他们有一年的标题,例如[2002]。 有些没有括号,我想纠正。
所以我试图找到一个正则表达式(我可以优先编译),在我的脑海中看起来像(^[\d4^])
,因为我想要一组不的4个数字它们周围有方括号。我正在使用括号以希望绑定它,以便我可以使用类似[\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
function或sub
函数。为了使其工作,您需要在一年中添加一组额外的括号,以将其标记为一个组。
此外,在指定替换时,您将组称为\1
,因此您必须转义\
或使用原始字符串。
>>> r = re.compile("(?<!\[)(\d{4})(?!\])")
>>> name = "2011 - This Year"
>>> r.sub(r"[\1]",name)
'[2011] - This Year'