csv 如何使用re.findall在路径文件名中添加查找年份

qvsjd97n  于 2023-09-27  发布在  其他
关注(0)|答案(4)|浏览(86)

使用re.findall在多个路径文件中使用循环查找数字。然而,有些文件包含其他数字或不包含'20'婴儿他们。想知道如何获得相应年份的文件。2014年或2020年。
下面是一些文件名的示例:

ts20individual25countaveragemedianbypostcode.csv
taxstats2016individual28countaveragemedianbypostcode.csv

然后我想把它添加到一个列表中

dfyear = []

for f in csv_files:
      
    # read the csv file
    df = pd.read_csv(f)
    
    x = [int(s) for s in re.findall(r'[\d]+', f)]
    dfyear.append(x)
pepwfjgg

pepwfjgg1#

  • "...一些文件包含其他数字或不包含其中的'20'婴儿。想知道如何获得相应年份的文件。2014年或2020年。..."*

看起来year值的前缀是 “ts”“taxstats”,所以我会使用这个。

(?:ts|taxstats)20\d*

下面是一个例子,其中 m 是匹配值的列表。

import re
f = ['ts20individual25countaveragemedianbypostcode.csv',
     'taxstats2016individual28countaveragemedianbypostcode.csv']
m = [x for x in f if re.search(r'(?:ts|taxstats)20\d*', x)]
hjqgdpho

hjqgdpho2#

如果所有年份都以20开头,并以两位数继续,则可以使用正则表达式

'20\d{2}'

或者-您是否也希望以19开头的年份

'(19|20)\d{2}'
nvbavucw

nvbavucw3#

您可以使用列表解析来逐步过滤和Map文件名:

from datetime import datetime
import pandas as pd
import re

# current year cannot be exceeded
year = datetime.now().year - 2000

# keep all 2 and 4 digit groups which might be years
matches = [list(map(int, re.findall("((?:20)?\d{2})", x))) for x in files]

# keep 2-digits years lower or equal to current year and 4-digits years
years = [list(filter(lambda x: (x<= year) or (x>=2000), match)) for match in matches]
years = [x[0]+2000 if x[0]<2000 else x[0] for x in years]

结果是:

print(matches)
[[20, 25], [2016, 28]]

print(years)
[2020, 2016]
c3frrgcw

c3frrgcw4#

lst = ['ts20individual25countaveragemedianbypostcode.csv',
'taxstats2016individual28countaveragemedianbypostcode.csv']

years = []
for f in lst:
    matches = re.search(r'\d{2}|\d{4}(?=individual)', f)
    if matches:
        year = matches.group(0)
        if len(year) == 2:
            year = '20' + year
            years.append(year)
        else:
            years.append(year)
       

print(years)

['2020', '2016']

相关问题