首页 > 解决方案 > 如何在python中转义文本以进行格式化

问题描述

我有以下文字。

"\*hello* * . [ }"

它应该像这样转义:

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

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

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

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

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

然后文本未格式化,如下所示:

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

但它应该是这样的:

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

一些例子:

\* \* \*只有中间的应该被转义 在只有\{ \{ \}中间的应该被转义

我需要这个用于 tex 格式: https ://core.telegram.org/bots/api#markdownv2-style

标签: pythonregexformattingmarkdownpython-telegram-bot

解决方案


既然您标记python-telegram-bot了 ,我将向您指出escape_markdown辅助函数。源代码在这里

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

编辑:

用例似乎是应该允许用户设置某种模板消息,这些模板消息可以具有动态输入。OP 没有(还)解释这些模板的外观,所以我只是举一个例子。假设用户想要指定格式的欢迎消息

Hello_there, {username}!

whereHello_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_markdownMarkdown 格式或html.escape来自 std 库的 HTML 格式来实现

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

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


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


推荐阅读