如何获取由特定字符分隔的字符串的一部分?
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 列表的条件。
- 您节省了一些命令调用。
- 免责声明:我不是正则表达式向导,所以上面的表达式可以改进,也许超出我的理解范围。
例如我有这个文件(可以是其中之一):
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 列表的条件。
- 您节省了一些命令调用。
- 免责声明:我不是正则表达式向导,所以上面的表达式可以改进,也许超出我的理解范围。