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

How to get part of string separated by specific character?

例如我有这个文件(可以是其中之一):

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 段)。最简单的方法是什么?

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

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

使用 split and/or 和 join 有什么困难吗?文档非常简单:split, join and lrange(这从列表中获取元素的子列表):

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

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

% regsub {^(([^_]+_){0}[^_]+).*$} "AX_001_123_890_v01" {}
AX
% regsub {^(([^_]+_){1}[^_]+).*$} "AX_001_123_890_v01" {}
AX_001
% regsub {^(([^_]+_){2}[^_]+).*$} "AX_001_123_890_v01" {}
AX_001_123
% regsub {^(([^_]+_){3}[^_]+).*$} "AX_001_123_890_v01" {}
AX_001_123_890
% regsub {^(([^_]+_){4}[^_]+).*$} "AX_001_123_890_v01" {}
AX_001_123_890_v01
  • 正则表达式使用量词 {0}{1}、... 将特定数量 n 的子表达式 ([^_]+_) 与输入字符串匹配。这个数字 n 等于 (m-1),其中 m 是您要查找的 "elements" 个数。
  • 基于正则表达式的方法不要求输入字符串(及其子字符串)符合有效 Tcl 列表的条件。
  • 您节省了一些命令调用。
  • 免责声明:我不是正则表达式向导,所以上面的表达式可以改进,也许超出我的理解范围。