0

我正在制作一个脚本来自动解析一些文本数据(具有复杂的结构)并将其插入 MySQL 数据库。

我希望有多个 for 循环,这些循环根据文件名的正则表达式匹配来迭代文件列表。最后,我将连接它们并将它们插入数据库。

这是我的正则表达式:

Trgx= re.compile('([a-zA-Z0-9]{3,4})_.*_.*_.*$');
Dtrgx= re.compile('[a-zA-Z0-9]{3,4}_[a-zA-Z0-9]{3,4}_([0-9]{10})_[0-9]{3}'); 
Mrgx= re.compile('.*_([a-zA-Z0-9]{3,4})_.*$'); 
Hrgx= re.compile('.*([0-9]{3}).csv$'); 

我的文件名如下所示:

ecd_cdd_2012102100_000.csv
ecd_cdd_2012102100_024.csv
ecd_hdd_2012102200_000.csv
ecd_hdd_2012102200_024.csv
ecd_hdd_2012102200_048.csv
ecd_avgt_2012102200_120.csv
ecd_avgt_2012102200_144.csv
ecd_avgt_2012102200_168.csv
ecd_mint_2012102200_192.csv
ecd_maxt_2012102200_144.csv
ecd_maxt_2012102200_168.csv
ecd_cdd_2012102200_000.csv
ecd_cdd_2012102200_024.csv

每个表达式都捕获文件名的一个子集:

  • Trgx捕获第一部分(本例中每个实例中的“ecd”)
  • Mrgx捕获第二部分(“cdd”、“hdd”、“avgt”等)
  • Dtrgx捕获日期/时间段(如 2012102100)
  • Hrgx 捕获最后一部分(如 000 或 024,在扩展之前)

每个文件名都将匹配每个正则表达式,但.group(1)将填充不同的值。

我想使用正则表达式作为“分组”元素来遍历文件,以便以正确的顺序将它们连接在一起。

像这样的东西:

for fileName in fileNameList
    for each distinct value in  Trgx.group(1)
         for each distinct value in  Dtrgx.group(1)
              for each distinct value in Hrgx.group(1)
                     do whatever
4

1 回答 1

2

将正则表达式组合在一起可能更容易

re_fn = re.compile('(?P<T>[a-zA-Z0-9]{3,4})_(?P<M>[a-zA-Z0-9]{3,4})_(?P<Dt>[0-9]{10})_(?P<H>[0-9]{3}).csv')

并省去维护四个正则表达式的麻烦。

然后你可以做

groups = re_fn.match(fileName).groupdict()
# do stuff with groups['T'], groups['M'], groups['Dt'], groups['H']
于 2012-10-23T03:28:15.590 回答