我是regexp的新手,有一个小任务。我必须编写一个函数,它接受一个DataFrame并返回一个过滤后的列名列表:
def get_ids(df: pd.DataFrame, other_id_vars: list=None) -> list:
pattern = re.compile('_id_|_id|id_')
list_ids = [col for col in df.columns if pattern.search(col)]
if other_id_vars is non None:
list_ids.extend(other_id_vars)
return list(set(list_ids))
需要id模式为(_id|_id_|id_)
的单词筛选列表,如下所示:
#from this
['subs_id', 'play_id_game', 'video', 'fluid', 'id_serv']
#into this
['subs_id', 'play_id_game', 'id_serv']
但我不喜欢上面提到的变体。你有更好的主意吗?
尝试:(?:_|^)id(?:_|$)
说明:
(?:...)
-非捕获组
_|^
-交替,匹配下划线_
或^
-单词的开头
id
-匹配id
字面上的
_|$
-交替,匹配下划线_
或$
-单词的末尾
演示
要从可能的结果中排除id
,请尝试(?:^id_|_id$|_id_)
您可以这样做。记住将列表中的每个值分解,并将这些值重新排序到一个单独的新列表中:
lst = ['subs_id', 'play_id_game', 'video', 'fluid',
'id_serv']
new_lst = []
for value in lst:
formatted_val = value.split('_')
for info in formatted_val:
if info == 'id' or info == 'lid' or info == 'idl':
new_lst.append(value)
print(new_lst)