Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 需要从字符串的最后一个字符中删除下划线_Regex_Python 2.7 - Fatal编程技术网

Regex 需要从字符串的最后一个字符中删除下划线

Regex 需要从字符串的最后一个字符中删除下划线,regex,python-2.7,Regex,Python 2.7,我需要帮助找到在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 o

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

你能帮忙吗?

首先,我要用

这是处理查找文件扩展名的标准方法

然后我只需检查最后一个字符是否为下划线,如果是,则将其删除:

>>> 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'

首先,我要用

这是处理查找文件扩展名的标准方法

然后我只需检查最后一个字符是否为下划线,如果是,则将其删除:

>>> 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'

从字符串中删除最后一个下划线的另一种方法是使用正则表达式

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
杰米·扎温斯基有句名言:

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

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


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

从字符串中删除最后一个下划线的另一种方法是使用正则表达式

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
杰米·扎温斯基有句名言:

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

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


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

谢谢,这正是我所需要的。非常感谢我的帮助。如果你觉得这有帮助,你可以考虑投票:谢谢,这正是我所需要的。如果你觉得这个有帮助的话,你可以考虑投票:)这很好,但是我更喜欢上面的方法。尽管如此,这仍然有效且可靠。谢谢,我更喜欢shuttle87方法,因为它很容易理解,与我的regexp相反。请看我的更新答案:)这非常有效,但我更喜欢上面的方法。尽管如此,这仍然有效且可靠。谢谢,我更喜欢shuttle87方法,因为它很容易理解,与我的regexp相反。请参阅我的更新答案:)