我需要帮助在Python 2.7中从派生字符串中删除下划线的最佳方法。 我有一系列我正在解析的文件名,第一部分提供了有关文件类型的信息。我需要该数据与数据库条目匹配。 这是摩擦,正则表达式发现了剥离周期,但尾随下划线仍然存在。因此,我无法在数据库中获得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
你能帮忙吗?
答案 0 :(得分: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'
答案 1 :(得分:1)
从字符串中删除最后一个下划线的另一种方法是使用正则表达式。
import re
my_string = 'abc_'
re.match(r'^(.*?)_?$', my_string).group(1)
这里我将整个字符串(因此^和$)与模式匹配,允许我在最后一个可选下划线(.*?
)之前懒惰地提取所有字符(_?
)。
字符是懒惰匹配的(.*?
而不是.*
),因此最后一个下划线不匹配。
请注意,上述方法只是一个正则表达技巧。事实上,如果我需要在不同的人维护的真实系统中解决这个问题,我更喜欢shuttle87的解决方案,因为它更加透明。
简单地说:
if last character is '_':
return new string without trailing character
else
return original string
Jamie Zawinski有一句名言:
有些人在面对问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。
在我们的案例中,这也适用。理解我提出的正则表达式需要更高级的正则表达式知识。初学程序员在阅读时可能会遇到很多问题。
因此,您应该将我的建议视为正则表达式练习,而不是在实际系统中应用的“干净代码”解决方案:)