需要修剪字符串中最后一个字符的下划线

时间:2016-09-18 03:44:07

标签: regex python-2.7

我需要帮助在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

你能帮忙吗?

2 个答案:

答案 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有一句名言:

  

有些人在面对问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。

在我们的案例中,这也适用。理解我提出的正则表达式需要更高级的正则表达式知识。初学程序员在阅读时可能会遇到很多问题。

因此,您应该将我的建议视为正则表达式练习,而不是在实际系统中应用的“干净代码”解决方案:)