【发布时间】:2021-08-21 23:51:25
【问题描述】:
我正在尝试使用 python (pandas) 和正则表达式加载文件。我找到了解决我的问题的解决方法,但我仍然想找到一个单一的解决方案,它可能对未来有用。文件格式如下:
1 (a b c) (a b c) (a b c)
2 (a b c) (a b c) (a b c)
3 a b c a b c a b c
请注意,有些是空格,有些是制表符,制表符和/或空格的数量不是恒定的。预期的结果是以下数据帧:
0 1 2 3 4 5 6 7 8 9
0 1 a b c a b c a b c
1 2 a b c a b c a b c
2 3 a b c a b c a b c
我的最佳结果是使用以下方法获得的:
pd.read_csv('filepath', delimiter='\)*\s+\(*', engine='python', header = None)
这给出了:
0 1 2 3 4 5 6 7 8 9
0 1 a b c a b c a b c)
1 2 a b c a b c a b c)
2 3 a b c a b c a b c
然后我通过额外的处理摆脱了“)”。我仍然不明白为什么 \s+ 足以删除标签,即 \t (如果有人也可以回答这个问题,那绝对是一个奖励)。
我尝试了不同的方法,但找不到一个可以完成这项工作的正则表达式。我的一些尝试:
\)*\s*\(*
(\)*\s+\(*)|(\))
(\)*\s+\(*)|(\)\n)
有些人很清楚为什么它们不起作用,但我希望最后一个是正确的解决方案。另一种想法是使用\)*\s*\(*,但强制至少一个字符出现在正则表达式中,但我没有找到是否可能。
知道什么是更好的正则表达式吗?
附:如果我逐行读取文件并将 re.split 与正则表达式一起使用,则拆分看起来会有所不同,但我更喜欢使用 pandas。
【问题讨论】:
-
这导致最后一列
NaN,可以轻松删除,但仍然有点害羞 -
\s+足以删除制表符,因为它转换为“一个或多个空格”,它将匹配制表符\t