【问题标题】:How to escape with backslash only not escaped characters如何只用反斜杠转义而不转义字符
【发布时间】:2021-09-06 10:30:47
【问题描述】:

如何仅使用反斜杠转义尚未转义的字符? 就像我有字符串

@gmail\.com\> \@hotmail.com test1[ test2\[

所需的输出是:

\@gmail\.com\> \@hotmail.com test1\[ test2\[

我的意思只是没有逃脱 @ 和 [ 被逃脱了。

试过

re.sub(r'(?<!\\\\)(?<!\\\\)([@*])' , r'\\\1','@g*mail\.com\>\@')
'\\@g\\*mail\\.com\\>\\\\@'

但是要得到@和*的反斜杠。

【问题讨论】:

  • 通常你不需要在 python 中转义 @ 或 [。我想你有这样做的理由吗?
  • 是的。我有一些字符列表,出于特定原因必须对其进行转义。
  • 也许你需要使用 .replace() 方法?
  • 如果它不存在,我必须添加反斜杠。我的意思是将 \ 添加到 @,而不是添加到 \@。

标签: python-3.x regex


【解决方案1】:

使用re.sub() 捕获所有出现的要转义且不以斜线\ 为前缀的字符。

  1. 使用您想要转义的所有字符初始化CHARS_TO_ESCAPE,例如@[。此时无需使用斜杠\ 转义它们,只需将字符本身放入(除非您想转义斜杠字符本身,这意味着您可能需要将其设为\\,因为python 字符串也将其用作转义字符)。
  2. 由于我们将使用正则表达式,我们必须转义 CHARS_TO_ESCAPE 中用于正则表达式模式的特殊字符,例如 [](){、@ 987654335@、-^等。我们可以使用re.escape()
  3. 构造一个正则表达式模式,该模式将捕获CHARS_TO_ESCAPE 中所有出现的不以斜线\ 为前缀的字符。这里我们使用(?&lt;!\\)(@|\[)
    • (?&lt;!\\) - 如果前一个字符是非斜线字符,则匹配。
    • (@|\[) - 捕获组 1,它是 CHARS_TO_ESCAPE 中的任何字符。请注意,[ 在此处以 \ 为前缀。这不是您的转义字符,而是一个正则表达式转义字符(有点令人困惑,因为它们都是斜线 \)。
  4. Substitute 通过\\\1 找到所有出现的正则表达式模式(没有以斜杠\ 为前缀的)以具有斜杠\ 前缀,其中第1 组如上一步中所述。
import re

CHARS_TO_ESCAPE = "@["  # Add here all characters that you want to escape
CHARS_TO_ESCAPE_RE = (  # This whole clause is equivalent to: CHARS_TO_ESCAPE_RE = r"(?<!\\)(@|\[)"
    r"(?<!\\)("
    + r"|".join(map(lambda value: re.escape(value), CHARS_TO_ESCAPE))
    + r")"
)
print(f"{CHARS_TO_ESCAPE_RE=}")

text = "@gmail\.com\> \@hotmail.com @yahoomail.com test1[ test2\["
text = re.sub(CHARS_TO_ESCAPE_RE, r"\\\1", text)
print(text)

输出:

CHARS_TO_ESCAPE_RE='(?<!\\\\)(@|\\[)'
\@gmail\.com\> \@hotmail.com \@yahoomail.com test1\[ test2\[

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多