python - 如何在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
解决方案
既然您标记python-telegram-bot
了 ,我将向您指出escape_markdown
辅助函数。源代码在这里
也许这对你有帮助。但是,我必须同意 Chris 的观点:我不清楚你真正想要实现什么。
编辑:
用例似乎是应该允许用户设置某种模板消息,这些模板消息可以具有动态输入。OP 没有(还)解释这些模板的外观,所以我只是举一个例子。假设用户想要指定格式的欢迎消息
Hello_there, {username}!
whereHello_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
Markdown 格式或html.escape
来自 std 库的 HTML 格式来实现用户发送带有标记字符的文本。以 Markdown 格式为例,机器人会收到一条消息说
_Hello_there_, *{username}!*
. 现在要将其转换为模板,您必须以某种方式转义相关字符。在这种情况下,这应该_Hello\_there_,*escaped_username\!*
在运行时。在这种情况下,我看不到一种安全的方法来决定什么逃跑,什么不逃跑。虽然您可以做一些正则表达式来例如转换*{username}!*
为*{username}\!*
,但您如何知道用户想要“ Hello there_”还是“ Hello_there ”?
因此,我强烈推荐第一种方法。
免责声明:我目前是python-telegram-bot
推荐阅读
- python - 在 Keras 中扩展张量
- reporting-services - 如何在组标题 SSRS 报告中插入列
- bash - 如果成功,如何构建 shell 脚本来构建 Docker-Compose 映像并启动 Docker 容器?
- oracle - Oracle:在 UNION 语句 ORA-00932 中,clob 列与自身不一致
- cloudflare - CloudFlare 未能将动态内容清除到博客文章中
- python - 并非所有参数都在 SQL 语句中使用 (executemany)
- ios - Swift 5、Alamofire、Combine、MVVM 抛出错误
- php - FPDF、FPDI、PDF 平铺:使用ImportedPage 放置?
- python - 撞球并在 PONG 中得分
- typescript - 如何优化 ts-loader 以减少解决问题的麻烦?