Python 标记:已注册图案的处理顺序

Python 标记:已注册图案的处理顺序,python,markdown,Python,Markdown,我已经基于InlineProcessor编写了一个用于标记的python扩展,当模式出现时,这些扩展会正确匹配: 自定义扩展名: 从markdown.util导入原子字符串,etree 从markdown.extensions导入扩展 从markdown.inlinepatterns导入InlineProcessor RE=r'(#)(\S{3,})' 类MyPattern(InlineProcessor): def handleMatch(自身、m、数据): tag=m.group(2) el

我已经基于
InlineProcessor
编写了一个用于标记的python扩展,当模式出现时,这些扩展会正确匹配:

自定义扩展名:

从markdown.util导入原子字符串,etree
从markdown.extensions导入扩展
从markdown.inlinepatterns导入InlineProcessor
RE=r'(#)(\S{3,})'
类MyPattern(InlineProcessor):
def handleMatch(自身、m、数据):
tag=m.group(2)
el=etree.Element(“a”)
el.set('href',f'/{tag}')
el.text=AtomicString(f'#{tag}')
返回el、m.开始(0)、m.结束(0)
MyExtension类(扩展名):
def扩展标记(自我、md、md_全局):
#如果由attr_列表扩展处理,则不是由此扩展处理
寄存器(MyPattern(RE,md),'my_tag',200)
def makeExtension(*args,**kwargs):
返回MyExtension(*args,**kwargs)
IN:
markdown('foo#bar')

OUT:
foo

但是,我的扩展正在破坏一个本机特性,该特性被称为python markdown之外的特性

中:
###Title{style=“color:#FF0000;”}

OUT:
Title{style=“color:

我不确定如何正确理解如何在文本上注册/应用模式。我尝试用一个高数字注册我的模式,以将其放在流程的末尾
md.inlinePatterns.register(MyPattern(RE,md),'my_tag',200)


我已经看过了,他们使用了基于
Treeprocessor
的类。我是否需要基于
Treeprocessor
而不是
InlineProcessor
为我的MyPattern创建一个类,以找到一种方法,在元素与另一个匹配的情况下不将我的标记应用于元素(那里:
attr\u list
)?

您需要一个更严格的正则表达式,它不会导致错误匹配。或者您可能需要更改您使用的语法,以便它不会与其他合法文本冲突

首先,事件的顺序是正确的。使用示例输入:

### Title {style="color:#FF0000;"}
InlineProcessor
获取它时,到目前为止,它已被处理为:

<h3>Title {style="color:#FF0000;"}</h3>
Title{style=“color:#FF0000;”
请注意,块级标记现在已存在(
),但尚未处理
属性列表。这就是您的问题。您的正则表达式正在匹配
\FF0000;“}
,并将其转换为链接:

最后,在所有的内联函数完成后,运行<代码> TraceListBux/CudioTeePrimeor,但是中间的链接不将文本识别为有效的TraceLIST,而忽略它(如应该)。 换句话说,你的问题根本与秩序无关。您不能在attr_list TreeProcessor之后运行内联处理器,因此您需要探索其他替代方案。您至少有两种选择:

  • 重写正则表达式,使其不具有错误匹配。你可能想尝试使用单词边界之类的东西
  • 重新考虑你提出的新语法
    #bar
    是一种非常模糊的语法,很可能在文本的其他地方再次出现,并导致错误匹配。也许您可以要求将其包装在括号中,或者使用哈希以外的字符

  • 我个人强烈建议第二种选择。阅读一些带有
    #条的文本,我不太清楚这是一个链接。然而,
    [#bar]
    (或类似)将更加清楚。

    这正是我正在考虑的两种解决方案
    Treeprocessor
    是在所有
    InlineProcessor
    替换和my标记更改语法后应用的,它们会中断解析。通过查看,我们看到它应用于
    root
    ,他是我的
    html
    代码。我认为将HEX中的颜色替换为RGB,但这只能推迟到后来的问题。我会听从你的建议,改进我的语法!