熊猫正则表达,不止一个选择?

时间:2018-04-21 11:58:10

标签: regex pandas

我有一个字符串,我在那里提取看起来像

的日期部分
A620170101 # output 20170101

在熊猫中我会做类似的事情,

df['var'] = df.sba.str.extract(r'A6(.{8})', expand=False)

但是,现在我需要更新以从一个看起来像

的字符串中提取日期
JT20170101 # output 20170101

我尝试添加|,但这不起作用。

这是一个快速测试数据,

d = {'var1': 'A620170101', 'var2': 'JT20170102', 'var3': '', 'var4': 'TG20170102'}
pd.DataFrame(list(d.items()), columns=['var', 'sba'])

我只想要带有A6和JT前缀的日期部分。

3 个答案:

答案 0 :(得分:2)

使用comment的解决方案:

df['var3'] = df.sba.str.extract(r'(?:JT|A6)(.{8})', expand=False)
print (df)
    var         sba      var3
0  var1  A620170101  20170101
1  var2  JT20170102  20170102
2  var3                   NaN
3  var4  TG20170102       NaN

另一个解决方案是检查前2个值,如果在列表中提取210值:

df['var3'] = np.where(df.sba.str[:2].isin(['A6','JT']), df.sba.str[2:10], np.nan)
print (df)
    var         sba      var3
0  var1  A620170101  20170101
1  var2  JT20170102  20170102
2  var3                   NaN
3  var4  TG20170102       NaN

答案 1 :(得分:0)

如果你想使用“|”运营商,您可以尝试类似:

(?:JT|A6)(.{8})

之前的答案也很好。

答案 2 :(得分:0)

如果您的数据长度始终相同,如上所示,您可以跳过使用正则表达式,只需获取代码的前两个字符,然后抓取日期的最后8个字符。

如果你想要一个捕获任何前缀代码(任何长度)和日期后缀的正则表达式,你可以使用它:

(.*)(\d{8})

我不熟悉熊猫,但我认为它适用于此。