如何在 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}
在运行时被替换为相应的字符串,应显示为粗体,包括!
.
我看到有两种方法可以解决这个问题。
用户将消息作为格式化文本发送(即 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 格式化来实现
用户发送带有标记字符的文本。以 Markdown 格式为例,机器人会收到一条消息说 _Hello_there_, *{username}!*
。现在要将其转换为模板,您必须以某种方式转义相关字符。在这种情况下,这在运行时应该是 _Hello\_there_,*escaped_username\!*
。
在这种情况下,我看不到一种安全的方法来决定什么该逃避什么不逃避。虽然你可以做一些正则表达式,例如将 *{username}!*
转换为 *{username}\!*
,你怎么知道用户想要“Hello there_”还是“Hello_there"?
因此我强烈推荐第一种方法。
免责声明:我目前是 python-telegram-bot
的维护者
我有以下文字。
"\*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}
在运行时被替换为相应的字符串,应显示为粗体,包括!
.
我看到有两种方法可以解决这个问题。
用户将消息作为格式化文本发送(即 Bot 收到消息“Hellow_there,{username} !").在这种情况下,只需存储
的 HTML 格式化来实现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
来自标准库用户发送带有标记字符的文本。以 Markdown 格式为例,机器人会收到一条消息说
_Hello_there_, *{username}!*
。现在要将其转换为模板,您必须以某种方式转义相关字符。在这种情况下,这在运行时应该是_Hello\_there_,*escaped_username\!*
。 在这种情况下,我看不到一种安全的方法来决定什么该逃避什么不逃避。虽然你可以做一些正则表达式,例如将*{username}!*
转换为*{username}\!*
,你怎么知道用户想要“Hello there_”还是“Hello_there"?
因此我强烈推荐第一种方法。
免责声明:我目前是 python-telegram-bot