如何获得由特定字符分隔的字符串的一部分?

时间:2019-01-15 01:55:13

标签: split tcl

例如,我有这个文件(可以是一个):

z:/test/output/AX_001_123_890_v01.exr
z:/test/output/AX_001_123_890_v01_preview_lores.exr

我使用此代码提取文件名:

[file rootname [file tail [value root.name]]]

输出=

AX_001_123_890_v01  
AX_001_123_890_v01_preview_lores

接下来,我只想提取AX_001_123部分(或从左边开始的前3个片段)。最简单的方法是什么?

3 个答案:

答案 0 :(得分:2)

使用拆分和/或连接是否有任何困难?该文档非常简单:splitjoinlrange(这将从列表中获得元素的子列表):

set input "AX_001_123_890_v01"
set output [join [lrange [split $input "_"] 0 2] "_"]
# AX_001_123

set input "AX_001_123_890_v01_preview_lores"
set output [join [lrange [split $input "_"] 0 2] "_"]
# AX_001_123

答案 1 :(得分:1)

您可能还需要考虑使用[regsub]来提取前缀字符串的正则表达式:

% regsub {^(([^_]+_){0}[^_]+).*$} "AX_001_123_890_v01" {\1}
AX
% regsub {^(([^_]+_){1}[^_]+).*$} "AX_001_123_890_v01" {\1}
AX_001
% regsub {^(([^_]+_){2}[^_]+).*$} "AX_001_123_890_v01" {\1}
AX_001_123
% regsub {^(([^_]+_){3}[^_]+).*$} "AX_001_123_890_v01" {\1}
AX_001_123_890
% regsub {^(([^_]+_){4}[^_]+).*$} "AX_001_123_890_v01" {\1}
AX_001_123_890_v01
  • 正则表达式使用量词{0}{1},...来将特定数量n的子表达式([^_]+_)与输入字符串进行匹配。这个数字n等于(m-1),其中m是您要查找的“元素”的数量。
  • 基于正则表达式的方法不需要将输入字符串(及其子字符串)限定为有效的Tcl列表。
  • 您保存了一些命令调用。
  • 免责声明:我不是正则表达式向导,因此可能会超出我的理解范围来改善上面的表达。

答案 2 :(得分:-1)

>>> n = 3
>>> groups = text.split('_')
>>> '_'.join(groups[:n]), '_'.join(groups[n:])

这将为您提供python中两个必需的组中的两个。