我是Python的新手,正在尝试分析一些数据。因此,我将文件夹中的所有 csv 文件导入并连接到单个数据帧中。我正在尝试提取部分文件名以用作标题,搜索后,我发现您通常会使用正则表达式。
文件名是这样的:'Varying Concentration2_20190712-145158_Base Media.csv'
、'Varying Concentration2_20190712-145158_250 g per l.csv'
等。所以我试图提取的部分是在_
之后和.csv
之前。
我试过:
for fname in all_data:
res = re.findall("(?<=_)(w+).csv$", fname)
if not res: continue
print (res)
也"(?<=[0-9]+_)(w+)"
但它似乎不起作用。
所需的输出将是一个包含 'Base Media'
、 '150g per l
' 等的列表。
这是一个避免正则表达式的选项,而是使用基本split
字符串函数两次:
filename = 'Varying Concentration2_20190712-145158_Base Media.csv'
parts = filename.split('_')
nameonly = parts[len(parts)-1].split('.')[0]
print(nameonly)
输出:
Base Media
如果完整的文件名也可以包含点,那么这个答案可能需要调整。
你可以做:
(?<=_)[^_]+(?=.csv$)
(?<=_)
是与_
匹配的零宽度正后视[^_]+
匹配一个或多个未_
字符,这是我们想要的部分(?=.csv$)
宽度为零,向前看确保我们在比赛结束后有csv
如果您不想使用环视,则可以使用普通模式并将所需的匹配项放在第一个(也是唯一的(捕获组中(并通过match.group(1)
而不是match.group()
获取输出(:
_([^_]+).csv$
例:
In [38]: text = 'Varying Concentration2_20190712-145158_Base Media.csv'
In [39]: re.search(r'(?<=_)[^_]+(?=.csv$)', text).group()
Out[39]: 'Base Media'
In [40]: text = 'Varying Concentration2_20190712-145158_250 g per l.csv'
In [41]: re.search(r'(?<=_)[^_]+(?=.csv$)', text).group()
Out[41]: '250 g per l'
使用以下命令:
^.*_(.*).csv$
所做的只是跳过所有内容,直到_
然后捕获所有内容,直到.csv
。
演示
您可以使用:
_([^._]+).csv
并采取第一个被俘虏的群体。
演示
解释:
_([^._]+)
找到_
并确保它是字符串中的最后一个,请从重复[^_]
中剔除_
。您还会删除一个点,以避免匹配扩展名.csv
这就是为什么您重复[^._]+
.它括在括号中([^._]+)
使其成为稍后可以使用的捕获组。
在蟒蛇中:
>>> text = 'Varying Concentration2_20190712-145158_Base Media.csv'
>>> re.search(r'_([^._]+).csv', text).group(1)
'Base Media'