py解析嵌套转换字符串

2024-05-21 07:35:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我花了一些时间将标记从lua转换为hmtl,但最近我得到了一个特殊情况,这些标记可以嵌套。下面是我的代码的一个快速示例:

from pyparsing import Literal, Word, Suppress, SkipTo, LineEnd, hexnums

text = "|c71d5FFFFI'm saying something in color|cFFFFFFFF then in white |r|r"

def colorize (t):
    hexRGB = "".join(list(t.hex)[:6])
    return "<span style=\"color:#{};\">{}</span>".format(hexRGB, t.content)

vbar = Literal("|")
eol = LineEnd().suppress()

endTag = ((vbar + (Literal("r")|Literal("R"))|eol))
parser = (
    Suppress(vbar + (Literal("c")|Literal("C"))) + 
    Word(hexnums, exact=8).setResultsName("hex") + 
    SkipTo(endTag).setResultsName("content") + 
    Suppress(endTag)
).addParseAction(colorize)

result = parser.transformString(text)
print (result)

我看到了另一个类似的问题Pyparsing: nested Markdown emphasis,但我的问题有点不同,有时没有closetag,而lineEnd充当一个closetag


Tags: textin标记wordcolorhexsuppressliteral
1条回答
网友
1楼 · 发布于 2024-05-21 07:35:50

您可以添加while循环来迭代结果,直到找到所有颜色:

from pyparsing import Literal, Word, Suppress, SkipTo, LineEnd, hexnums


def colorize (t):
    hexRGB = "".join(list(t.hex)[:6])
    return "<span style=\"color:#{};\">{}</span>".format(hexRGB, t.content)

vbar = Literal("|")
eol = LineEnd().suppress()

endTag = ((vbar + (Literal("r")|Literal("R"))|eol))
parser = (
    Suppress(vbar + (Literal("c")|Literal("C"))) + 
    Word(hexnums, exact=8).setResultsName("hex") + 
    SkipTo(endTag).setResultsName("content") + 
    Suppress(endTag)
).addParseAction(colorize)

result = parser.transformString(text)
new_result = parser.transformString(result)

while(result != new_result):
   result = new_result
   new_result = parser.transformString(result)


print (result)

text = "|c71d5FFFFI'm saying something in color|cFFFFFFFF then in white |r|r"时:

输出:

<span style="color:#71d5FF;">I'm saying something in color<span style="color:#FFFFFF;"> then in white</span></span>

text = "|c71d5FFFFI'm saying something in color"

输出:

<span style="color:#71d5FF;">I'm saying something in color</span>

相关问题 更多 >