如何在 python 中转义文本以进行格式化

how to escape texts for formatting in python

我有以下文字。

"\*hello* * . [ }"

应该这样转义:

"\*hello\* \* \. \[ \}"

如何使用 python 正则表达式做到这一点?

每个特殊字符(特殊字符有:_*[]()~`>#+-=|{}.!必须用前面的字符\.

进行转义

我用这个试过了,但是每个字符都被转义了:

escape_chars = r'_*[]()~`>#+-=|{}.!'
return re.sub(f'([{re.escape(escape_chars)}])', r'\', text)

然后文本像这样未格式化:

\*hello\* \* \. \[ \}

但应该是这样的:

**hello** \* \. \[ \}

一些例子:

\* \* \*只有中间那个应该被转义在\{ \{ \}只有中间一个应该被转义

我需要这个来进行 tex 格式化: https://core.telegram.org/bots/api#markdownv2-style

既然你标记了 python-telegram-bot,我会把你指向 escape_markdown helper function. the source code for this is here

也许这对你有帮助。但是,我必须同意 Chris 的观点:我不清楚您真正想要实现的目标。

编辑:

用例似乎是应该允许用户设置某些类型的模板消息,这些消息可以具有动态输入。 OP(还)没有解释这些模板到底是什么样子的,所以我只是举一个例子。假设用户想要指定格式为

的欢迎消息
Hello_there, {username}!

其中Hello_there为斜体,{username}在运行时被替换为相应的字符串,应显示为粗体,包括!.

我看到有两种方法可以解决这个问题。

  1. 用户将消息作为格式化文本发送(即 Bot 收到消息“Hellow_there{username} !").在这种情况下,只需存储 update.effective_message.text_markdown(_v2)/text_html 即可存储模板。参见 Message.text_html。然后在运行时,您需要做的就是 send_message(template.format(username=escaped_username), parse_mode=...)。请注意,这里 escaped_username 是一个包含特殊字符转义的用户名的字符串。这可以通过 escape_markdown 进行降价格式化或使用 html.escape 来自标准库

    的 HTML 格式化来实现
  2. 用户发送带有标记字符的文本。以 Markdown 格式为例,机器人会收到一条消息说 _Hello_there_, *{username}!*。现在要将其转换为模板,您必须以某种方式转义相关字符。在这种情况下,这在运行时应该是 _Hello\_there_,*escaped_username\!*。 在这种情况下,我看不到一种安全的方法来决定什么该逃避什么不逃避。虽然你可以做一些正则表达式,例如将 *{username}!* 转换为 *{username}\!*,你怎么知道用户想要“Hello there_”还是“Hello_there"?

因此我强烈推荐第一种方法。


免责声明:我目前是 python-telegram-bot

的维护者