0

假设我有一个音频文件名列表(它可以是任何带有连续数字的字符串列表),它们具有不同的命名方案,但它们都在其文件名中包含轨道编号。

我想提取不断变化的数字。

示例 1

Fooband 41 - Live - 1. Foo Title
...
Fooband 41 - Live - 11. Another Foo Title

期望的结果

数字列表:1,2,3,...,11

示例 2

02. Barband - Foo Title with a 4 in it
05. Barband - Another Foo Title
03. Barband - Bar Title
...
17. Barband - Yet another Foo Title

期望的结果

数字列表:2,5,3,...,17

由于索引号的位置不固定,我(认为)我不能在那里使用正则表达式。

我有的

  1. 找到字符串的共同前缀和后缀并将其删除
  2. 查看字符串的左侧/右侧是否有数字
  3. 使用该数字获取索引

但是有一个问题:如果我找到Example 1的公共前缀,那么公共前缀将是 Fooband 41 - Live - 1, 所以1会丢失(对于像Song X - 10, Song X - 11, ...).

问题

什么是检测和提取字符串列表中不断变化的数字(在相似位置)的好方法?

我正在使用 Python(这对这个问题并不重要)

如果我也能检测到罗马数字,那将是一个奖励,但我怀疑这会困难得多。

4

2 回答 2

1
f = open('data.txt')
data = []

pattern = "\d+|[IVX]+"
regex = re.compile(pattern)

for line in f:
    matches = re.findall(regex, line)
    data.append(matches)

f.close()

print data
transposed_data = zip(*data)
print transposed_data

for atuple in transposed_data:
    val = atuple[0]

    if all([num==val for num in atuple]): 
        next
    else:
        print atuple
        break

数据.txt:

Fooband 41 - Live - 1. Foo Title
Fooband 41 - Live - 2. Foo Title
Fooband 41 - Live - 3. Foo Title
Fooband 41 - Live - 11. Another Foo Title

- 输出: -

[['41', '1'], ['41', '2'], ['41', '3'], ['41', '11']]
[('41', '41', '41', '41'), ('1', '2', '3', '11')]
('1', '2', '3', '11')

数据.txt:

01. Barband - Foo Title with a 4 in it
05. Barband - Another Foo Title
03. Barband - Bar Title
17. Barband - Yet another Foo Title

- 输出: -

[['01', '4'], ['05'], ['03'], ['17']]
[('01', '05', '03', '17')]
('01', '05', '03', '17')

数据.txt:

01 Barband - Foo Title with a (I) in it
01 Barband - Another Foo (II) Title
01. Barband - Bar Title (IV)
01. Barband - Yet another (XII) Foo Title

- 输出: -

[['01', 'I'], ['01', 'II'], ['01', 'IV'], ['01', 'XII']]
[('01', '01', '01', '01'), ('I', 'II', 'IV', 'XII')]
('I', 'II', 'IV', 'XII')
于 2013-06-06T11:16:02.640 回答
0

如果它们的格式相似,则可以使用 python 的re 模块。从字符串列表中提取这些数字的简短代码如下所示:

import re
regex = re.compile(".*([0-9]+).*")

number = regex.match("Fooband 41 - Live - 1. Foo Title").group(1)
于 2013-06-06T10:57:14.757 回答