2016-09-18 63 views
0

我需要幫助,以便從Python 2.7中的派生字符串中移除下劃線的最佳方法。 我有一系列我正在解析的文件名,第一部分給出了關於文件類型的信息。我需要這些數據來匹配數據庫條目。 這裏是擦,正則表達式findall剝離期間,但尾部下劃線仍然存在。因此,我無法在數據庫中獲得1:1的匹配。需要修整字符串中最後一個字符的下劃線

tmr_ba_incr_2016091500.csv 
orm_160915.csv 
TXT_MNG.160916.done 

findall給了我輸出中的3個元素;

tmr_ba_incr_, 2016091500, csv 
orm_, 160915, csv 
TXT_MNG, 160916, done 

第一個元素需要放下結尾下劃線。 我無法找到有效執行此操作的方法。

tmr_ba_incr_ should be tmr_ba_incr 
orm_ should be orm 
TXT_MNG should be TXT_MNG 

你能幫忙嗎?

回答

1

首先我要脫光文件類型與os.path.splitext

>>> import os 
>>> os.path.splitext("tmr_ba_incr_2016091500.csv") 
('tmr_ba_incr_2016091500', '.csv') 

這是對付找到的文件擴展名的標準方法。

然後我剛剛檢查的最後一個字符是一個下劃線,並刪除它,如果它是:

>>> def remove_last_underscore(iterable): 
...  if iterable[-1] == '_': 
...   return iterable[:len(iterable)-1] 
...  else: 
...   return iterable 
... 
>>> remove_last_underscore("this_has_trailing_underscore_") 
'this_has_trailing_underscore' 
>>> remove_last_underscore("asda_asd_as") 
'asda_asd_as' 
+0

這工作太棒了,但我更喜歡上面的方法。儘管如此,這是有效的,並且是穩固的謝謝 –

+0

我更喜歡shuttle87方法,因爲它可以很容易理解,與我的正則表達式相反。看到我更新的答案:) –

1

使用正則表達式從字符串中除去最後下劃線的另一種方式。

import re 

my_string = 'abc_' 
re.match(r'^(.*?)_?$', my_string).group(1) 

我在這裏對陣圖案,讓整個字符串(從而^和$),讓我最後一個可選下劃線(_?)前懶洋洋地(.*?)中提取的所有字符。

字符匹配延遲(.*?而不是.*),以便最後的下劃線不匹配。


請注意,上述方法只是一個普通的表達技巧。事實上,如果我需要在由不同人維護的實際系統中解決這個問題,我寧願穿梭87的解決方案,因爲它更簡單。

它只是簡單地寫着:

if last character is '_': 
    return new string without trailing character 
else 
    return original string 

有來自傑米·薩溫斯基一句名言:

一些人,當遇到一個問題,認爲「我知道,我將使用正則表達式「。現在他們有兩個問題。

在我們的例子中這也適用。瞭解我提出的正則表達式需要更多正則表達式的高級知識。初學者程序員在閱讀時可能會遇到很多問題。

所以你應該把我的建議是一個正則表達式的鍛鍊,在實際系統中應用不是一個「乾淨的代碼」的解決方案:)

+0

謝謝,這正是我所需要的。 –

+1

偉大,我可以幫助。如果你覺得這有助於你可能會考慮upvoting :) –

相關問題