2012-06-25 52 views
0

我有這樣的正則表達式使用正向和反向查找aheads:Python:固定長度正則表達式是否必需?

import re 
re.compile("<!inc\((?=.*?\)!>)|(?<=<!inc\(.*?)\)!>") 

我試圖將它移植從C#到Python,但不斷收到錯誤

look-behind requires fixed-width pattern 

是否有可能改寫這在Python中沒有失去意義?

的想法是爲它我使用的lookarounds解析HTTP,我已經修改了多文本匹配類似

<!inc(C:\My Documents\file.jpg)!> 

更新

body = r"""------abc 
Content-Disposition: form-data; name="upfile"; filename="file.txt" 
Content-Type: text/plain 

<!inc(C:\Temp\file.txt)!> 
------abc 
Content-Disposition: form-data; name="upfile2"; filename="pic.png" 
Content-Type: image/png 

<!inc(C:\Temp\pic.png)!> 
------abc 
Content-Disposition: form-data; name="note" 

this is a note 
------abc-- 
""" 

multiparts = re.compile(...).split(body) 

我想在分割時獲取文件路徑和其他文本,而不必刪除開始和結束標記

代碼簡潔很重要,但如果它使正則表達式可行,我可以改變<!inc(格式。

+2

您是否嘗試過使用原始字符串? 're.compile(r'''正則表達式''')' – C0deH4cker

+0

「向後看」。你的意思是向後看。 –

+2

您可以使用[regex模塊](http://pypi.python.org/pypi/regex)而不是標準re,它支持可變長度的lookbehinds。 – georg

回答

3

對於同一陣列中的路徑+「一切」,只是分裂的開始和結束標記:

import re 
p = re.compile(r'''<!inc\(|\)!>''') 
awesome = p.split(body) 

你說你在結束標記靈活,如果)!>可以在代碼的其他地方發生,您可能需要考慮將結束標記更改爲)!/inc>(或其他任何內容,只要它是唯一的)即可。

See it run.

+0

+1 ::可選用'。+?'替換非空白內部匹配的'。*?' –

+0

@ user1215106:這與他現有的正則表達式不匹配。請記住,這是從C#到Python的一個端口。 – ohaal

+0

這就是爲什麼我寫**可選**並解釋什麼會改變,先生。 –

2

從文檔:

(?<!...)

匹配,如果字符串中的當前位置不匹配的前面....這就是所謂的負向後斷言。類似於肯定的向後隱藏聲明,包含的模式只能匹配一些固定長度的字符串。以反向lookbehind斷言開頭的模式可能會匹配搜索字符串的開頭。如果

(?<=...)

匹配字符串中的當前位置由匹配......這在當前位置結束之前。這被稱爲積極向後看斷言。 (?< = abc)def會在abcdef中找到匹配項,因爲lookbehind將備份3個字符並檢查包含的模式是否匹配。包含的模式只能匹配一些固定長度的字符串,這意味着允許abc或a | b,但a *和a {3,4}不允許。請注意,以正向lookbehind斷言開始的模式在搜索字符串的開頭不匹配;你很可能想使用search()函數而不是match()函數:

強調我的。不,我不認爲你可以將它移植到當前形式的Python中。

+0

是的,我閱讀了文檔,並希望SO上的某個人足夠聰明,可以幫助我重寫這些內容,因爲文檔說他們不被允許。謝謝! – Chad

+0

此答案已添加到[Stack Overflow Regular Expression FAQ](http://stackoverflow.com/a/22944075/2736496),在「Lookarounds」下。 – aliteralmind

1
import re 

pat = re.compile("\<\!inc\((.*?)\)\!\>") 

f = pat.match(r"<!inc(C:\My Documents\file.jpg)!>").group(1) 

導致f == 'C:\My Documents\file.jpg'

響應給Jon Clements的:

print re.escape("<!inc(filename)!>") 

導致

\<\!inc\(filename\)\!\> 

結論:re.escape似乎認爲他們應該逃脫。

+0

任何理由逃避'<','!' and '>'?編譯聲明傳統上應該是一個r''str –