Python 在Regex上循环以按多个名称-值组合提取列

Python 在Regex上循环以按多个名称-值组合提取列,python,regex,pandas,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\u re

我有一个数据框,它的列名是
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\u required\u数据集('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

但这不起作用,即使我将
元组
转换为
列表
。显然,由于
regex
只接受一个
字符串
。我考虑了一个Lambda Apply方法,该方法应用regex函数,但无法使其也起作用。我只是不知道如何做到这一点,现在需要一些帮助。I

您可以使用基于替代的模式,只需使用非捕获组包装替代

persDf = df.filter(regex=('^(?:{})[0-9]+$'.format('|'.join(args))))
这将创建一个类似正则表达式的
^(?:v | tm | zz)[0-9]+$
,这意味着:

  • ^
    -字符串的开头
  • (?:v | tm | zz)
    -任何备选方案:
    v
    ,或
    tm
    ,或
    zz
  • [0-9]+
    -1+位
  • $
    -字符串结束
见和:


尝试
'^(?:{})[0-9]+$'.format('.|'.join(args))
而不是
'^'+args+r'[0-9]+$'
df[[col for col in df.columns if('v'in col或'tm'in col或'zz'in col)]应该只返回包含这些字母的列。Wiktors解决方案适合我。非常感谢你!请写一份解决方案,以便我确认。