一、前言
前几天在Python最强王者交流群【哎呦喂 是豆子~】问了一个Python
数据提取的问题,一起来看看吧。
大佬们请问下 指定列提取连续6位数据的单号(该列含文字、数字、大小写字母等等),连续数字超过6位、小于6位的数据不要,这个为啥有的数据可以提取 有的就提取不出来?
上一篇文章大家激烈探讨,但是暂时还没有找到更好的思路,这一篇文章我们继续沿着上篇文章的讨论,来看看吧!
二、实现过程
这里【猫药师Kelly】给了一个思路,使用C老师帮忙助力,每次只提取一种模式,然后update合并。
相当于把每行所有可能列出来,之后再合并。
后来【Wayne.Wu】给了一个代码,如下所示:
代码语言:javascript复制def extract_digits(my_list):
target_digits = []
for item in my_list:
for i in range(len(item)):
if item[i:i 6].isdigit() and len(item[i:i 6]) == 6:
target_digits.append(item[i:i 6])
return target_digits
my_list = ['abc123', '123456', 'xyz789', '9876543', '12qw345', '12345678']
target_digits = extract_digits(my_list)
print(target_digits)
不过看上去也还差了一点点,需要改进下。
后来【郑煜哲·Xiaopang】也给了一个思路,如下所示:
不过可惜的是正则表达式不太好用,误报比较大,现在得换思路。【Wayne.Wu】提出多正则表达式匹配规则助力。
【黑科技·鼓包】也给了一个思路,如下所示:
不过还是存在了点问题。后来【瑜亮老师】也给了一个思路和代码,如下所示:
代码语言:javascript复制df = pd.read_csv('示例.csv', encoding='gbk')
pattern = r'D(d{6})(?=D|$)'
df['提取单号'] = df['理由'].map(lambda x: re.findall(pattern, x)[0] if len(re.findall(pattern, x)) >= 1 else 0)
print(df)
代码运行后可以得到下图的预期结果:
不过还留了一点点小尾巴,下一篇文章一起来看看吧!
三、总结
大家好,我是皮皮。这篇文章主要盘点了一个Python
正则表达式数据提取的问题,文中针对该问题,给出了具体的解析和代码实现,帮助粉丝顺利解决了问题。
最后感谢粉丝【哎呦喂 是豆子~】提问,感谢【瑜亮老师】、【猫药师Kelly】、【隔壁