我有一个包含文本模式的大文本文件,从该文件中我制作了一个熊猫数据框,如下所示,从这个模式列中我想选择一个包含数字的模式,连续数字的长度正好是4
例如,a1234bc5678被接受,我们可以从中获得两个新的4位模式,例如1234和5678,但是a12345不被接受,因为连续数字的长度是5,而不是4
print (df.sample(20))
pattern
13457358 187019980
9892646 920204
2258941 dong998
5792706 diao511001
9144372 a2805938
15519502 YUEH008
15831448 752099429
15659305 469919209
13769825 majunsui
3446320 sishenD2
12970622 woaini123
11633295 guswjddl
12708217 342423198706
2079106 zj87755202
12551254 mxt19950626
4572063 1985625
7805173 theend0512
484820 jzm5583385
15017582 1981122
10868176 30061984
我所尝试的:这是一个字符串,它为我生成了错误的输出,因为我只需要精确的4个连续数字。另外,如果我能完成的话,我需要在熊猫数据框上完成
text = '1234sunwei198734'
postcodes = re.findall('\d{4}',text)
print(postcodes)
最后我这样做了
df2['pins'] = df2['pattern'].apply(lambda x: re.findall('(?<!\d)\d{4}(?!\d)',x))
df3 = df2[df2['pins'].apply(lambda x: len(x)) > 0]
虽然已经给出了正则表达式,但在熊猫专栏中回答您的评论
文章中的示例数据集:
将regex应用于pandas列ie
pattern
这里,您可以使用下面的语法,该语法基本上返回如下所示的列表对象因此,您可以将这些空列表对象转换为字符串,该字符串将成为
NaN
,然后删除所有这些对象,因为您只需要匹配值在文章的最后一部分采用更好的方法:
为了获得更好的解决方案,您需要导入
re
模块来使用您的方法,这不是必需的,您只需按如下方式操作即可。虽然选择是你的:-)根据您的描述,您可能正在寻找
见a demo on regex101.com
我认为这项任务最好的正则表达式是
(?<!\d)(1234|2345|3456|4567|5678|6789|7890|8901|9012|0123)(?!\d)
当然,你可以删除你不想要的东西
如果不想明确说明4个连续数字的模式,可以使用不太有效的方法,如:
\D(\d{4})\D
相关问题 更多 >
编程相关推荐