我是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
'等的列表。
答案 0 :(得分:0)
您可以这样做:
(?<=_)[^_]+(?=\.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'
答案 1 :(得分:0)
答案 2 :(得分:0)
您可以使用:
_([^._]+).csv
并参加第一个被捕获的小组。
说明:
_([^._]+)
找到_
,并确保它是字符串的最后一个,您从重复_
中剔除[^_]
。您还删除了一个点,以避免匹配扩展名.csv
,这就是为什么重复[^._]+
的原因。它被括在方括号([^._]+)
中,使其成为捕获组,以后可以使用。
在python中:
>>> text = 'Varying Concentration2_20190712-145158_Base Media.csv'
>>> re.search(r'_([^._]+).csv', text).group(1)
'Base Media'
答案 3 :(得分:0)
这是一个避免使用正则表达式的选项,而是两次使用基本的split
字符串函数:
filename = 'Varying Concentration2_20190712-145158_Base Media.csv'
parts = filename.split('_')
nameonly = parts[len(parts)-1].split('.')[0]
print(nameonly)
输出:
Base Media
如果完整的文件名也可以包含点,则可能需要调整此答案。