Python提取文件名regex的一部分

时间:2019-07-19 10:29:35

标签: python regex python-3.x

我是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'等的列表。

4 个答案:

答案 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)

使用以下内容:

^.*_(.*)\.csv$

这一切都是跳过所有内容,直到_,然后捕获所有内容,直到.csv

Demo

答案 2 :(得分:0)

您可以使用:

_([^._]+).csv

并参加第一个被捕获的小组。

Demo

说明:

_([^._]+)找到_,并确保它是字符串的最后一个,您从重复_中剔除[^_]。您还删除了一个点,以避免匹配扩展名.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

如果完整的文件名也可以包含点,则可能需要调整此答案。