奇数或偶数个反斜杠和转义字符

时间:2015-05-25 15:45:29

标签: python regex python-3.x

我对以下代码有点问题。

import re

pattern = re.compile(r"((?:^|[^\\@]|\\.)+)@")

for text in [
    r"ok@\@.py",
    r"ok@\\@.py",
    r"ok@\\\@.py",
    r"ok@\\\\@.py",
    r"ok@\\\\\@.py",
]:
    search = re.search(pattern, text)
    print('---', text, sep="\n")

    if search:
        print(pattern.sub(r"\1<star>", text))

    else:
        print('<< NOTHING FOUND ! >>')

打印:

---
ok@\@.py
ok<star>\@.py
---
ok@\\@.py
ok<star>\\<star>.py
---
ok@\\\@.py
ok<star>\\\<star>.py
---
ok@\\\\@.py
ok<star>\\\\<star>.py
---
ok@\\\\\@.py
ok<star>\\\\\<star>.py

问题始于第3个输出错误,因为首先是转义反斜杠,然后是转义字符@。问题仍然存在于更多的反斜杠:只看到最后一个带有两个转义反斜杠的输出,然后是转义的字符@ ..

这是预期的输出,其中@确实只有在它之前有一个奇数的\才被转义。

---
ok@\@.py
ok<star>\@.py
---
ok@\\@.py
ok<star>\\<star>.py
---
ok@\\\@.py
ok<star>\\\@.py
---
ok@\\\\@.py
ok<star>\\\\<star>.py
---
ok@\\\\\@.py
ok<star>\\\\\@.py

我的正则表达式有什么问题以及如何修复它?

1 个答案:

答案 0 :(得分:1)

使用以下正则表达式:

pattern = re.compile(r"(?<!\\)((?:\\\\)*)@")

仅用<star>

替换

输出:

ok<star>\@.py 
ok<star>\\<star>.py
ok<star>\\\@.py
ok<star>\\\\<star>.py
ok<star>\\\\\@.py

请参阅DEMO