正则表达式匹配,直到找到第三个字符,并从字符串末尾开始计数所述字符的出现

时间:2018-07-30 14:32:24

标签: regex

让我们深入了解:输入:

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

从字符串的开头开始,我需要进行匹配,直到找到第三个出现的“ _”(下划线),但我需要从字符串的末尾开始计数“ _”(下划线)。

感谢任何提示

最诚挚的问候

3 个答案:

答案 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)

我相信这个正则表达式可以解决问题!

^.*?(?=_[^_]*_[^_]*_[^_]*$)

Online Demo


说明:

  • ^行的开头
  • .*?匹配尽可能多的字符
  • (?=...)断言其内容符合我们的匹配条件
    • _[^_]*_[^_]*_[^_]*在比赛结束后恰好寻找三个下划线。
    • $行的结尾

答案 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\}$##'

在行_的末尾找到三组_和零个或多个非$字符,不作任何替换('')。