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



我有以下文本。

"*hello* * . [ }"

它应该像这样逃脱:

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

如何使用python-regex做到这一点?

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

我试过这个,但后来每个角色都逃脱了:

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

然后文本被取消格式化如下:

*hello* * . [ }

但应该是这样的:

**hello** * . [ }

一些例子:

* * *,只有中间的一个应该逃脱在{ { },只有中间一个应该逃避

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

由于您标记了python-telegram-bot,我将向您介绍escape_markdown辅助函数。这个的源代码在这里

也许这对你有帮助。然而,我不得不同意克里斯的观点:我不清楚你到底想实现什么。

编辑:

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

Hello_there, {username}!

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

我认为有两种方法可以解决这个问题。

  1. 用户以格式化文本的形式发送消息(即Bot接收消息">Hello_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"?

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


免责声明:我目前是python-telegram-bot的维护人员

最新更新