我想使用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
模式的主要区别在于,我们取消了前瞻性,而是使用两个捕获组来获取数字。