使用regex获取文件扩展名前的数字



我想使用regex从文件名列表中提取两条信息。这两个数字总是位于文件扩展名之前,并用短划线分隔。在下面的文件名示例中,我的目标是10和11。为了获得扩展名之前的数字(示例中为11(,我使用d+(?=.raw),它似乎可以工作。然而,我很难为之前的数字找到类似的东西(在这个例子中是10(。

D:CDTFlatten0220210730-HK-S-006-PLATE-flatten-sliced20210730-HK-S-006-PLATE-flatten-10-11.raw

该表达式将用于以以下方式在pandas数据帧中创建新列:df['y'] = df['Filename'].apply(lambda x: re.findall('d+(?=.raw)', x)[0])

您可以尝试以下操作:

import pandas as pd
import re
data = {'Filename': ['something-1-2.csv','something-10-11.raw']}
df = pd.DataFrame(data)
pattern = r'(d+)-(d+(?=..+$))'
df['y'] = df['Filename'].apply(lambda x: re.findall(pattern,x)[0])
print(df)
Filename         y
0    something-1-2.csv    (1, 2)
1  something-10-11.raw  (10, 11)
# or if you want to split them in different cols immediately, try:
df[['y1','y2']] = df['Filename'].apply(lambda x: re.findall(pattern,x)[0]).tolist()
print(df)
Filename  y1  y2
0    something-1-2.csv   1   2
1  something-10-11.raw  10  11

尝试使用str.findall()

import pandas as pd
df = pd.DataFrame({'Filename': [r'D:CDTFlatten0220210730-HK-S-006-PLATE-flatten-sliced20210730-HK-S-006-PLATE-flatten-10-11.raw'']})
df['y'] = df['Filename'].str.findall(r'd+(?=(?:-d+)?.[^.]+$)')
print(df)

打印:

Filename         y
0  D:CDTFlatten0220210730-HK-S-006-PLATE-flatte...  [10, 11]

使用的模式:

d+(?=(?:-d+)?.[^.]+$)

查看在线演示

  • d+-1+位
  • (?=——开启正向前瞻;
    • (?:-d+)?-可选的非捕获组,用于匹配连字符和1+数字
    • .[^.]+$-文字点,后跟1+非点和结束线锚

编辑

或者,如果您必须将这些放在单独的列中,我们可以使用str.extract():

import pandas as pd
df = pd.DataFrame({'Filename': [r'D:CDTFlatten0220210730-HK-S-006-PLATE-flatten-sliced20210730-HK-S-006-PLATE-flatten-10-11.raw'']})
df[['y1','y2']] = df['Filename'].str.extract(r'(d+)-(d+).[^.]+$')
print(df)

打印:

Filename  y1  y2
0  D:CDTFlatten0220210730-HK-S-006-PLATE-flatte...  10  11

模式的主要区别在于,我们取消了前瞻性,而是使用两个捕获组来获取数字。