2015-10-05 67 views
3

我想將一些「markdown」標籤替換爲html標籤。如何通過python將markdown標籤替換爲html?

例如:

#Title1# 
##title2## 
Welcome to **My Home Page** 

會變成

<h1>Title1</h1> 
<h2>title2</h2> 
Welcome to <b>My Home Page</b> 

我只是不知道該怎麼做......對於標題1,我嘗試這樣做:

#!/usr/bin/env python3 
import re 
text = ''' 
     #Title1# 
     ##title2## 
''' 
p = re.compile('^#\w*#\n$') 
print(p.sub('<h1>\w*</h1>',text)) 

但沒有任何反應。

#Title1# 
##title2## 

那些bbcode/markdown語言如何進入html標籤?

+7

你應該使用[markdown解析器](https://pypi.python.org/pypi/Markdown) –

+2

尋找一些Markdown解析器。搜索「pypi markdown解析器」會得出幾個結果。我對他們沒有任何經驗,所以我認爲你應該下載他們,並嘗試一些Markdown格式的文本。 – nhahtdh

+1

謝謝,但我想知道這些降價語言是如何工作的,我願意爲我的主頁上的python3 cgi程序編寫我自己的樣式降價標準。 –

回答

3

檢查這個表達式:demo

在這裏你可以看到我是如何取代#...#<h1>...</h1>。 我相信你可以得到這個工作與雙#等,以獲得其他減價功能考慮,但你仍然應該聽@Thomas和@nhahtdh評論,並使用降價解析器。在這種情況下使用正則表達式是不可靠的,緩慢和不安全的。

至於內嵌文本,如**...**<b>...</b>你可以試試這個正則表達式替換:demo。希望你可以爲其他功能(如下劃線等)加以減弱。

+0

謝謝,我會在稍後嘗試降價解析器。我嘗試重置text ='#title#'並打印(p.sub('

\ 1

',text))。程序返回

。 \ 1是什麼意思?如何定義永不需要修改的內容? –

+0

'\ 1'是捕獲組1的反向引用。您將需要檢查如何在Python中執行此操作,因爲我對此語言不熟悉。 – Asunez

+0

我明白了!謝謝。 –

1

您的正則表達式不起作用,因爲在默認模式下,^$(分別)匹配整個字符串的開頭和結尾。

'^'

(尖)匹配MULTILINE模式也各換行符後立即匹配字符串,和開始(我EMPH)

'$'

匹配的字符串的結尾或字符串末尾的換行符之前,並且MULTILINE模式在換行符之前也匹配。 foo匹配'foo'和'foobar',而正則表達式foo$僅匹配'foo'。更有意思的是,尋找foo.$'foo1\nfoo2\n'通常與'foo2'匹配,但在MULTILINE模式下'foo1'在'foo\n'中搜索單個$將會找到兩個(空)匹配項:一個位於換行符之前,另一個位於字符串末尾。

7.2.1. Regular Expression Syntax

添加標誌re.MULTILINE在編譯行:

p = re.compile('^#(\w*)#\n$', re.MULTILINE) 

,它應該工作 - 至少對於單個的詞,比如你的榜樣。更好的檢查將是

p = re.compile('^#([^#]*)#\n$', re.MULTILINE) 

- 任何不包含#的序列。

在這兩個表達式中,您需要在想要複製的部分周圍添加括號,以便您可以在替換代碼中使用該文本。請參閱關於Grouping的官方文檔。

+1

當你提到「單線模式」時,它會和's'標誌混淆,這使得'.'匹配新行。 (好吧,這個命名很混亂,我剛開始時就被它咬了)。更準確地說,默認情況下,'^'和'$'匹配整個字符串的開始和結尾。你需要MULTILINE模式(m標誌)來使它們也匹配行的開始和結束。 – nhahtdh