我有一个带有“汽车”列的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)
答案 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