让我们深入了解:输入:
p9_rec_tonly_.cr_called.seg
p9_tonly_.cr_called.seg
p10_nor_nor_.cr_called.seg
p10_rec_tn_.cr_called.seg
p10_tn_.cr_called.seg
p26_rec_nor_nor_.cr_called.seg
p26_rec_tn_.cr_called.seg
p26_tn_.cr_called.seg
所需的输出:
p9_rec
p9
p10_nor
p10_rec
p10
p26_rec_nor
p26_rec
p26
从字符串的开头开始,我需要进行匹配,直到找到第三个出现的“ _”(下划线),但我需要从字符串的末尾开始计数“ _”(下划线)。
感谢任何提示
最诚挚的问候
答案 0 :(得分:1)
您应该考虑使用正则表达式来解决此问题。例如,如果您使用的是Python,则只需使用限制为3的rsplit
并获取第一个结果字符串:
>>> data = [
'p9_rec_tonly_.cr_called.seg',
'p9_tonly_.cr_called.seg',
'p10_nor_nor_.cr_called.seg',
'p10_rec_tn_.cr_called.seg',
'p10_tn_.cr_called.seg',
'p26_rec_nor_nor_.cr_called.seg',
'p26_rec_tn_.cr_called.seg',
'p26_tn_.cr_called.seg',
]
>>> for d in data:
print(d.rsplit('_', 3)[0])
p9_rec
p9
p10_nor
p10_rec
p10
p26_rec_nor
p26_rec
p26
答案 1 :(得分:1)
我相信这个正则表达式可以解决问题!
^.*?(?=_[^_]*_[^_]*_[^_]*$)
说明:
^
行的开头.*?
匹配尽可能多的字符(?=...)
断言其内容符合我们的匹配条件
_[^_]*_[^_]*_[^_]*
在比赛结束后恰好寻找三个下划线。$
行的结尾答案 2 :(得分:1)
bash
,您说什么?嗯,这不是正则表达式,但是您可以进行模式替换(或使用bash剥离):
while read var ; do echo ${var%_*_*_*} ; done <<EOT
p9_rec_tonly_.cr_called.seg
p9_tonly_.cr_called.seg
p10_nor_nor_.cr_called.seg
p10_rec_tn_.cr_called.seg
p10_tn_.cr_called.seg
p26_rec_nor_nor_.cr_called.seg
p26_rec_tn_.cr_called.seg
p26_tn_.cr_called.seg
EOT
${var%_*_*_*}
扩展变量var
,剥离_*_*_*
的短后缀匹配。
否则,要在shell中执行正则表达式操作,通常可以向sed
之类的实用程序寻求帮助,并通过以下方式输入行:
sed -e 's#_[^_]*_[^_]*_[^_]*$##'
或简称:
sed -e 's#\(_[^_]*\)\{3\}$##'
在行_
的末尾找到三组_
和零个或多个非$
字符,不作任何替换(''
)。