2010-07-23 102 views
0

我已經試過這爲斜體:連續的,相互衝突的正則表達式替換

r = re.compile(r"(\*[^ ]+\*)") 
r.sub(r'<i>"\1"</i>', foo) 

,但它不工作,因爲我在正則表達式知道肯定有人會馬上看到。

+1

正則表達式是特別壞的這種任務,通常是因爲他們從來正是你想要的貪婪量。在你的單個單詞的特定情況下,你會好起來的,但是如果你正試圖重塑Markdown,那麼你需要一個真正的解析器,而正則表達式不是解析器(儘管很多人希望它們是)。 – msw 2010-07-23 01:47:25

回答

1

你的正則表達式和替換需要一些調整。

r = re.compile(r"(\*[^ ]+\*)") 

你在這裏捕獲得太多 - 星號保存在\1

r.sub(r'<i>"\1"</i>', foo) 

您在這裏代替了太多 - 雙引號標記包含在替換中。例如:

r.sub(r'<i>"\1"</i>', '*foo*') # -> '<i>"*foo*"</i>' 

嘗試這樣:

foo = '***foo***' 
bold = re.compile(r'''\*\*([^ ]+)\*\*''') 
ital = re.compile(r'''\*([^ ]+)\*''') 

ital.sub(r'''<i>\1</i>''', bold.sub(r'''<b>\1</b>''', foo)) # '<b><i>foo</i></b>' 
+0

工程就像一個魅力,謝謝。 – shino 2010-07-25 06:02:42

2

如果切換替代順序,它很容易工作。首先處理大膽的案例將防止斜體接管。