根据单词之间的数字范围选择字符串

时间:2018-12-31 20:13:05

标签: python regex

我正在尝试编写与数据框中的列匹配的正则表达式。数据框中的所有列都是

    cols = ['after_1', 'after_2', 'after_3', 'after_4', 'after_5', 'after_6',
   'after_7', 'after_8', 'after_9', 'after_10', 'after_11', 'after_12',
   'after_13', 'after_14', 'after_15', 'after_16', 'after_17', 'after_18',
   'after_19', 'after_20', 'after_21', 'after_22', 'after_10_missing',
   'after_11_missing', 'after_12_missing', 'after_13_missing',
   'after_14_missing', 'after_15_missing', 'after_16_missing',
   'after_17_missing', 'after_18_missing', 'after_19_missing',
   'after_1_missing', 'after_20_missing', 'after_21_missing',
   'after_22_missing', 'after_2_missing', 'after_3_missing',
   'after_4_missing', 'after_5_missing', 'after_6_missing',
   'after_7_missing', 'after_8_missing', 'after_9_missing']

我想选择字符串中所有值在1到14之间的列。

此代码有效

df.filter(regex = '^after_[1-9]$|after_([1-9]\D|1[0-4])').columns

但是我想知道如何在一行中制作它,而不是将它拆分成两行。第一部分选择所有以1到9之间的数字结尾的字符串(即'after_1'...'after_9'),而不选择与它们对应的“ missing”。第二部分(在|之后),选择以'after '开头且在1到9之间,后跟单词字符或以1开头,后跟0-4的任何字符串。

有没有更好的方法来写这个?

我已经尝试过

    df.filter(regex = 'after_([1-9]|1[0-4])').columns

但这会选择以1或2(即'after_20')开头的字符串

1 个答案:

答案 0 :(得分:1)

尝试以下操作:after_([1-9]|1[0-4])[a-zA-Z_]*\b

import re
regexp = '''(after_)([1-9]|1[0-4])(_missing)*\\b'''
cols = ['after_1', 'after_14', 'after_15', 'after_14_missing', 'after_15_missing', 'after_9_missing']

for i in cols:
 print(i , re.findall(regexp, i))

enter image description here