【问题标题】:Generate html from plain text with formatting markers in Python 3在 Python 3 中使用带有格式标记的纯文本生成 html
【发布时间】:2011-07-10 05:27:22
【问题描述】:

我编写了一组 Python 3 脚本来获取格式化的文本文件并将数据移动到 SQLite 数据库中。然后将数据库中的数据用作 PHP 应用程序的一部分。我的文本文件中的数据具有粗体和斜体的格式标记,但浏览器无法理解。格式化方案是这样的:

fi:xxxx        (italics on the word xxxx (turned off at the word break))
fi:{xxx…xxx}   (italics on the word or phrase in the curly brackets {})
fb:xxxx        (bold on the word xxxx (turned off at the word break))
fb:{xxx}       (bold on the word or phrase in the brackets {})
fv:xxxx        (bold on the word xxxx (turned off at the word break))
fv:{xxx…xxx}   (bold on the word or phrase in the brackets {})
fn:{xxx…xxx}   (no formatting)

我想将源文本的每一行转换为(1. 包含字符串的行,使用 html 标记而不是源格式和 2. 另一行,包含去除所有格式标记的字符串)。即使在该行上没有使用格式化标记,我也需要为每个源行设置一个格式化和一个剥离的行。在源数据中,不同(或相同)排序的多个格式标记可能会显示在一行中,但您不会找到任何不会在该行之前结束的标记。

【问题讨论】:

  • 听起来像是正则表达式的案例。
  • 你为什么不使用 Markdown 或一些类似的轻量级标记语言,而不是自己发明?
  • 我很乐意。不幸的是,我正在使用我已经从另一个来源获得的数据。我的脚本的全部原因是将它转换为更标准的东西,以便我可以使用它。大部分转换已经完成,但我还有这个格式问题需要处理。
  • 顺便说一句,我无法找到一种方法来使用正则表达式来执行此操作,而无需对我找到的进行搜索和替换的字符串进行切片,而且我找不到切片的方法细绳。如果您有使用正则表达式的巧妙方法,请分享。

标签: python html python-3.x text-parsing


【解决方案1】:

要格式化括号中的部分,您可以执行以下操作:

while text.find(":{") > -1:
    index = text.find(":{")
    if text[index-2:index]=="fb":
        text = text[:index-2] + "<b>" + text[index+2:] #insert <b>
        text = text.replace("}","</b>",1) # replace one.
    # else if fi, fv, etc.

这会将“other fb:{bold text} text”转换为“other bold text text”。

然后你可以转换空格分隔的部分:

array = text.split(" ")
for word in array:
    if (word.startswith("fi")):
        word = "<i>"+word[2:]+"</i>"
    else if (word.startswith("fb")):
        ....
text = " ".join(array)

如果您想要纯文本,只需将“”和“”等标签替换为空字符串“”即可。

如果格式不跨越多行,您可能会获得更好的性能读取和逐行转换:

inFile = open("file.txt","r")
outFile = open("file.out","w")

def convert(text):
    #Change text here.
    return text

for line in inFile:
    outFile.write(convert(line))

【讨论】:

  • 这可能会处理我的开始标签,但它仍然会让我留下我的结束标签来弄清楚。 "}" 可以表示 或 ,具体取决于它正在关闭的标签,并且它可以与开始标签相距几个单词。另外,对于没有括号的标签,我仍然需要在单词的末尾生成一个结束标签。
  • 您可能需要在 for 循环中编写一些正则表达式才能使其工作。
  • 即使使用正则表达式,如果我将单词分解成一个数组,如果结束标记出现在数组中的另一个单词之后,我将如何处理它?
  • 你可以一块一块地做,不用正则表达式,查看更新的答案。
  • 好的,我正在努力让它工作,但仍在挣扎。我如何将它与我正在使用的文本联系起来?我正在使用 readline 从我的文件中提取。另外,我将如何获得干净的线条(无格式)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多