2013-05-29 22 views
-1

我试图让这个下面的代码:的Python:子模式不会取代所有的模式发现

pattern = r"#(.*?)#" 
pattern_obj = re.compile(pattern, re.MULTILINE) 
translation = pattern_obj.sub("<li>\\1</li>", translation) 

来查找#包围任何文字。它取代一审

>>><li> TEXT </li> 

# More TEXT # 

# Even more TEXT # 

有人能帮我吗?

感谢您提前!编辑: 我刚刚修复这样的问题。

pattern = r"#([^#]*)#" 
pattern_obj = re.compile(pattern, re.MULTILINE) 
translation = pattern_obj.sub("<li>\\1</li>", translation) 
+2

它适用于我,即使没有“re.MULTLINE” – prM

+0

奇怪的是,手动排除'#'解决了问题。我会认为这个非贪婪的'*?'会阻止它成为一个问题。也许括号把'*?'的范围搞砸了? – acattle

回答

-1

docs

(圆点)在默认模式中,该匹配除了一个 换行符的任何字符。如果已经指定了DOTALL标志,则该标志匹配任何包含换行符的 字符。

由于.与新行不匹配,表达式仅查找第一行作为匹配。

但是,设置DOTALL标志也无济于事。由于正则表达式特殊字符通常是贪婪的,因此最终匹配第一个#和最后一个#之间的所有文本。

我可能会误解,但我相信你需要一条一条的做。

+0

'*'后面的'?'使其不贪婪。 – Cairnarvon

+0

即使'*'是贪婪的,一旦'。。'未能匹配新行,它会开始退出匹配,直到它匹配'#'。因此,这应该不会影响执行。 – acattle