新换行符自定义降价扩展

时间:2012-09-26 17:38:22

标签: regex python-2.7 markdown line-breaks

我正在编写python-markdown的扩展名,它应该将我的一些自定义标记中的文本放入样式化的div中。

我创建了一个简单的Inline Pattern类,它将匹配的表达式封装在div标签中。我的正则表达式如下:r'(\{mytag_start\})(.+)(\{mytag_end\})'然后在编译时由markdown.inlinepatterns.Pattern类放入"^(.*?) --- (.*?)$"内,以便将编译方法调用为{{ 1}}。

乍一看,这确实可以解决问题,但我注意到所有换行都需要硬编码为re.compile("^(.*?)%s(.*?)$" %r'(\{mytag_start\})(.+)(\{mytag_end\})')标签。

所以

<br>

但是,以下代码会破坏整个降价

{mytag_start}This code<br>
will work{mytag_end}

所以我只是用纯文本来处理整个上面的块。

我尝试将re.MULTILINE和re.DOTALL提供给{mytag_start}This code will not{mytag_end} ,但它没有帮助。有什么想法吗?

编辑: Here是展示上述问题的示例扩展文件。然后,我使用re.compile在我的django模板中加载扩展程序。

1 个答案:

答案 0 :(得分:0)

尝试使用非贪婪的运算符(+后紧跟?):

r'(\{mytag_start\})(.+?)(\{mytag_end\})'

完整正则表达式:

^(?:.*?)(\{mytag_start\})(.+?)(\{mytag_end\})(?:.*?)$

标志:

DOTALL,IGNORECASE,MULTILINE

数据测试

blah 
blash
<h1>Title</h1>
{mytag_start}This code<br>
will work{mytag_end}
<b>bold</b>

{mytag_start}This code

will not{mytag_end}

输出

# Run findall
>>> regex.findall(string)
[(u'{mytag_start}', u'This code<br>\nwill work', u'{mytag_end}'), (u'{mytag_start}', u'This code\n\nwill not', u'{mytag_end}')]