Python:格式化字符串以在 Markdown 或 HTML 中显示为明文?
Python: Format string to appear as plaintext in Markdown or HTML?
我正在使用 Telegram 机器人从我的 Python 程序发送消息。 Telegram 要求您发送的所有机器人消息都采用 Markdown 或 HTML.
格式
我想要的只是我的 Python 程序中的字符串在 Telegram 消息的接收端以完全相同的方式显示。
问题是,我要发送的文本是从 public 中提取的,所以它可以是任何东西,包括在这些格式中具有意义的特殊字符,这完全搞砸了消息。
有没有一种方法可以将此消息字符串格式化为其中一种格式,以便它在另一端显示为纯文本?
编辑: 我已经尝试了很多东西。正如 mmiron 所建议的,我尝试将我的字符串转义为 html,但我无法开始工作。似乎发生的是特殊的 (<,>,#) 字符完全搞砸了消息,即使我用 &
之类的字符引用替换它们
我还尝试将我的字符串转义为 Markdown,结果非常奇怪。与 HTML 不同,使用 markdown 似乎更有可能实际发送文本,但特殊字符(尤其是 #)似乎会搞砸结果
这是带有 Markdown 的起始文本
>>Bravo: Priyanka Chopra, Navya Naveli Nanda praise Jharkhand girl who got #Harvard University scholarship https://url
"Educate a girl you can change the whole community"
- - - - - - - - - - - - - - - - - - - - - -
Sunchartist
(@sunchartist)
j1.1
- - - - - - - - - - - - - - - - - - - - - -
9:09PM +43seconds 23-4-2021
[Chopra]
(Balance: .43)
-----------------------------------
<https://twitter.com/sunchartist/status/1385777945248030723>
-----------------------------------
<https://www.url.com>
转成markdown发送后,这是我收到的电报信息:
'\>Bravo: Priyanka Chopra, Navya Naveli Nanda praise Jharkhand girl who got Harvard University scholarship https://url
"Educate a girl you can change the whole community"
\- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \-
Sunchartist
\(@sunchartist\)
j1\.1
\- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \-
9:09PM \ 43seconds 23\-4\-2021
[Chopra\]
\(Balance: \.43\)
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
<https://twitter\.com/sunchartist/status/1385777945248030723\>
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
<https://www\.url\.com\>
很明显,转义函数在每个特殊字符前添加了一个反斜杠。奇怪的是,除了
中的第一个括号外,它似乎没有将其正确解析为 markdown
[Chopra\]
以及原文中出现在链接之前的第一个<
<https://www\.url\.com\>
这很奇怪,因为出于某种原因,它似乎只对 [] 或 <> 中的开始字符有效,但对结束字符无效。
我也尝试过使用 HTML 标志用 <pre>...</pre>
换行,但这似乎没有任何效果,除了在它发送时更改电报上的文本颜色,它只会这样做如果我删除有问题的特殊字符
如果文本中的任何一点有一个标签 (#),它似乎只发送标签之前的文本,但在它之后发送 none。由于某种原因
,降价和 html 都是如此
import html
escaped = html.escape(EXTERNAL_INPUT_STRING)
然后将 escaped
作为 HTML 发送。另见 https://core.telegram.org/bots/api#sendmessage
好的,我终于解决了。在此张贴以供将来参考。
我永远无法让 HTML 工作,所以我仍然不确定。
所以首先,我有 parse_mode=Markdown 而不是 parse_mode=MarkdownV2
接下来,使用 \ 运算符确实可以将一些特定字符显示为文字。相反,您需要使用 Percent-Encoding 来保留这些符号。
这是我用来修复该部分的代码。
message_body=message_body.replace('%', '\%25')
message_body=message_body.replace('#', '\%23')
message_body=message_body.replace('+', '\%2B')
message_body=message_body.replace('*', '\%2A')
message_body=message_body.replace('&', '\%26')
修复了 %、#、+... 我可能会做得更多 elegant/faster 但这目前有效。
最后,\ 运算符确实可以为一组字符创建文字。这是我用来修复这些问题的代码
message_body = re.sub(r"([_*\[\]()~`>\#\+\-=|\.!{}])", r"\", message_body)
要添加特定的 Telegram 转义,您可以使用来自 telegram-text:
的 PlainText
from telegram_text import PlainText
element = PlainText("Your non-escaped text!")
escaped_text = element.to_markdown()
escaped_text
'Your non\-escaped text\!'
我正在使用 Telegram 机器人从我的 Python 程序发送消息。 Telegram 要求您发送的所有机器人消息都采用 Markdown 或 HTML.
格式我想要的只是我的 Python 程序中的字符串在 Telegram 消息的接收端以完全相同的方式显示。
问题是,我要发送的文本是从 public 中提取的,所以它可以是任何东西,包括在这些格式中具有意义的特殊字符,这完全搞砸了消息。
有没有一种方法可以将此消息字符串格式化为其中一种格式,以便它在另一端显示为纯文本?
编辑: 我已经尝试了很多东西。正如 mmiron 所建议的,我尝试将我的字符串转义为 html,但我无法开始工作。似乎发生的是特殊的 (<,>,#) 字符完全搞砸了消息,即使我用 &
我还尝试将我的字符串转义为 Markdown,结果非常奇怪。与 HTML 不同,使用 markdown 似乎更有可能实际发送文本,但特殊字符(尤其是 #)似乎会搞砸结果
这是带有 Markdown 的起始文本
>>Bravo: Priyanka Chopra, Navya Naveli Nanda praise Jharkhand girl who got #Harvard University scholarship https://url
"Educate a girl you can change the whole community"
- - - - - - - - - - - - - - - - - - - - - -
Sunchartist
(@sunchartist)
j1.1
- - - - - - - - - - - - - - - - - - - - - -
9:09PM +43seconds 23-4-2021
[Chopra]
(Balance: .43)
-----------------------------------
<https://twitter.com/sunchartist/status/1385777945248030723>
-----------------------------------
<https://www.url.com>
转成markdown发送后,这是我收到的电报信息:
'\>Bravo: Priyanka Chopra, Navya Naveli Nanda praise Jharkhand girl who got Harvard University scholarship https://url
"Educate a girl you can change the whole community"
\- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \-
Sunchartist
\(@sunchartist\)
j1\.1
\- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \- \-
9:09PM \ 43seconds 23\-4\-2021
[Chopra\]
\(Balance: \.43\)
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
<https://twitter\.com/sunchartist/status/1385777945248030723\>
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
<https://www\.url\.com\>
很明显,转义函数在每个特殊字符前添加了一个反斜杠。奇怪的是,除了
中的第一个括号外,它似乎没有将其正确解析为 markdown[Chopra\]
以及原文中出现在链接之前的第一个<
<https://www\.url\.com\>
这很奇怪,因为出于某种原因,它似乎只对 [] 或 <> 中的开始字符有效,但对结束字符无效。
我也尝试过使用 HTML 标志用 <pre>...</pre>
换行,但这似乎没有任何效果,除了在它发送时更改电报上的文本颜色,它只会这样做如果我删除有问题的特殊字符
如果文本中的任何一点有一个标签 (#),它似乎只发送标签之前的文本,但在它之后发送 none。由于某种原因
,降价和 html 都是如此import html
escaped = html.escape(EXTERNAL_INPUT_STRING)
然后将 escaped
作为 HTML 发送。另见 https://core.telegram.org/bots/api#sendmessage
好的,我终于解决了。在此张贴以供将来参考。
我永远无法让 HTML 工作,所以我仍然不确定。
所以首先,我有 parse_mode=Markdown 而不是 parse_mode=MarkdownV2
接下来,使用 \ 运算符确实可以将一些特定字符显示为文字。相反,您需要使用 Percent-Encoding 来保留这些符号。
这是我用来修复该部分的代码。
message_body=message_body.replace('%', '\%25')
message_body=message_body.replace('#', '\%23')
message_body=message_body.replace('+', '\%2B')
message_body=message_body.replace('*', '\%2A')
message_body=message_body.replace('&', '\%26')
修复了 %、#、+... 我可能会做得更多 elegant/faster 但这目前有效。
最后,\ 运算符确实可以为一组字符创建文字。这是我用来修复这些问题的代码
message_body = re.sub(r"([_*\[\]()~`>\#\+\-=|\.!{}])", r"\", message_body)
要添加特定的 Telegram 转义,您可以使用来自 telegram-text:
的 PlainTextfrom telegram_text import PlainText
element = PlainText("Your non-escaped text!")
escaped_text = element.to_markdown()
escaped_text
'Your non\-escaped text\!'