在正则表达式上循环以通过多个名称-值组合提取列

时间:2019-05-29 10:47:14

标签: python regex pandas

我有一个数据框,其列名类似v1,...,v99, tm1,...tm99,依此类推。并非每个数字都存在一列(mybe v42丢失)。字母可以从a到zzz之间变化。我编写了一种方法,该方法根据字母组合(例如'v''tm')后跟数字来过滤我的列。看起来像

def create_required_dataset(df, var_filter):
    persDf = df.filter(regex=('^' + var_filter + r'[0-9]+$'))
    return persDf

此方法create_required_dataset('v')有效,并且我收到一个数据框,其中所有列均以v开头,后跟一个数字。

,效果很好。但是现在,我不仅要传递一个字母组合('tm','zzz'),而且要传递用户输入的字母组合。

因此查询应类似于:

create_required_dataset('v', 'tm', 'zz')

我尝试使用*args,所以我将方法重写为

def create_required_dataset(df, *args):
    persDf = df.filter(regex=('^' + args + r'[0-9]+$'))
    return persD

但是,即使我将tuple转换为list,也无法正常工作。显然,由于regex只需要一个string。我想到了一个应用regex函数的Lambda-Apply方法,但无法使其正常工作。我只是不知道如何立即完成此工作,需要一些帮助。我

1 个答案:

答案 0 :(得分:1)

您可以使用基于交替的模式,只需将其他选项包裹在一个非捕获组中

persDf = df.filter(regex=('^(?:{})[0-9]+$'.format('|'.join(args))))

这将创建一个像^(?:v|tm|zz)[0-9]+$这样的正则表达式,表示:

  • ^-字符串的开头
  • (?:v|tm|zz)-任何以下选择:vtmzz
  • [0-9]+-1个以上数字
  • $-字符串的结尾。

请参见regex demoits graph

enter image description here