将捕获组与pandas列中的给定模式匹配

时间:2019-05-27 19:20:36

标签: python regex pandas

我有一个带有“汽车”列的DataFrame'tdf',其中值是4个字母,然后是1-6个数字。

Cars
JAXT450678
KYXS 56746
LMOP01456
...

我已经编译了正则表达式以匹配它:
 r'(?=[a-zA-Z]{4}\s*\d{1,6}\b)([a-zA-Z]{4})(\s?\d+)'

我想做的是去掉空白,然后确保如果第二组中的位数少于6位,则从第二组开始插入0,直到计数为6,这样结果是:

Cars
JAXT450678
KYXS056746
LMOP001456
...

感谢您的帮助。我尝试过使用.replace.sub并能替换整个比赛,但是我不知道如何引用该小组并使其动态比赛。

tdf = tdf.replace(r'(?=[a-zA-Z]{4}\s*\d{1,6}\b)([a-zA-Z]{4})(\s?\d+)','000000', regex = True)

3 个答案:

答案 0 :(得分:2)

您可以使用

df['Cars'] = df['Cars'].str.replace(r'^([a-zA-Z]{4})\s*(\d{1,6})$', lambda x: "{}{}".format(x.group(1), x.group(2).zfill(6)))

详细信息

  • ^-匹配字符串的开头
  • ([a-zA-Z]{4})-第1组:四个字母
  • \s*-超过0个空格
  • (\d{1,6})-第2组:1到6位数字
  • $-字符串的结尾。

可调用的lambda x: "{}{}".format(x.group(1), x.group(2).zfill(6))连接第1组值和第2组值,并用零填充最多6个位置。

由于\s*不在括号内,因此从结果中省略了与此模式匹配的空格。

答案 1 :(得分:2)

使用replace替换空格,使用zfill填充字符串的数字部分,

df['Cars'].str.replace(' ', '').apply(lambda x: x[:4] + x[4:].zfill(6))

0    JAXT450678
1    KYXS056746
2    LMOP001456

答案 2 :(得分:1)

不是一线人,但是您可以避免使用apply

s = df.Cars.str.slice(4).str.strip().str.zfill(6)
df.Cars.str.slice(0,4) + s

输出:

0    JAXT450678
1    KYXS056746
2    LMOP001456
Name: Cars, dtype: object