2014-05-20 129 views
0

我有現有的正則表達式:修改現有的正則表達式

self.metadata = re.sub('(?<=<file_name>)\d{4,}','', self.metadata) 

這將做如下轉換:

<file_name>1232434_FILE.mov --> <file_name>FILE.mov 

不過,我不希望它剝奪一個文件名,如果有一個.(期間)之後。

所以,結果應該是:

<file_name>1232434_FILE.mov --> <file_name>FILE.mov 
<file_name>123445.mov --> <file_name>123445.mov 

會是什麼新的正確的正則表達式使用?

+0

是的,這是蟒蛇 – David542

回答

2

您應該添加前瞻:

self.metadata = re.sub('(?<=<file_name>)\d{4,}(?![.\d])','', self.metadata) 
<file_name>1232434_FILE.mov => <file_name>_FILE.mov 
<file_name>1232434FILE.mov => <file_name>FILE.mov 
<file_name>123445.mov  => <file_name>123445.mov 

Regular expression visualization

Debuggex Demo

+0

大聲笑,我猜負前瞻更有意義比一個negatiave字符類+1先行 – Sam

0

添加向前看來聲明您的文件名後面跟着一個非數字字符,非.字符。請注意,我們不能只查找非.字符,因爲這可能是您的第5位數字(因爲我們匹配4位以上)。

self.metadata = re.sub('(?<=<file_name>)\d{4,}(?=[^\d.])','', self.metadata) 

RegEx

(?<=<file_name>)\d{4,}(?=[^\d.]) 

注意,這將取代<file_name>1232434_FILE.mov<file_name>_FILE.mov但是你現有的解決方案確實是以及..