2016-09-18 60 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 :) –

相关问题