搜索
bottom↓
回复: 20

python自带split函数当分隔符在边界时就出现Bug,重写split函数解决

[复制链接]

出0入112汤圆

发表于 2022-8-29 21:36:10 | 显示全部楼层 |阅读模式
本帖最后由 xunke 于 2022-8-30 07:16 编辑

python内置的split函数详解网址https://www.runoob.com/python/att-string-split.html

当分隔符在边界时就出现bug,例子如下面截图所示


本人自己写的split函数解决这个问题,代码如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入442汤圆

发表于 2022-8-29 22:03:28 来自手机 | 显示全部楼层
看看split有没有trim功能。。

出40入518汤圆

发表于 2022-8-29 22:08:14 | 显示全部楼层
s1其实最后就是有个结束符吧,“看不见”而已。字节流这样切分吧结束符分到后面,也是合理吧

出615入1076汤圆

发表于 2022-8-29 22:12:26 来自手机 | 显示全部楼层
len(s1)

看一下字符串长度

出0入984汤圆

发表于 2022-8-29 22:24:26 | 显示全部楼层
本帖最后由 Himem 于 2022-8-29 22:25 编辑

结果就是这样呀,
各个语言都是这个逻辑

不然split('a')试试 或者换成'abccba'

出0入112汤圆

 楼主| 发表于 2022-8-30 07:18:58 | 显示全部楼层
dukelec 发表于 2022-8-29 22:12
len(s1)

看一下字符串长度
(引用自4楼)

结果是6个

出0入58汤圆

发表于 2022-8-30 07:23:17 来自手机 | 显示全部楼层
先trim一下在split搞定

出0入112汤圆

 楼主| 发表于 2022-8-30 08:18:21 | 显示全部楼层
Himem 发表于 2022-8-29 22:24
结果就是这样呀,
各个语言都是这个逻辑

(引用自5楼)

以a分隔结果是['', 'bc', 'bc']

出0入112汤圆

 楼主| 发表于 2022-8-30 08:23:55 | 显示全部楼层
本帖最后由 xunke 于 2022-8-30 11:30 编辑
shawn_bu 发表于 2022-8-30 07:23
先trim一下在split搞定
(引用自7楼)


没有空格,并且与空格无关。
python没发现有trim函数。

出0入112汤圆

 楼主| 发表于 2022-8-30 08:26:11 | 显示全部楼层
wye11083 发表于 2022-8-29 22:03
看看split有没有trim功能。。
(引用自2楼)

搜了下,python没trim函数,
python去空格方法是strip()函数

出0入112汤圆

 楼主| 发表于 2022-8-30 08:28:14 | 显示全部楼层
智涅 发表于 2022-8-29 22:08
s1其实最后就是有个结束符吧,“看不见”而已。字节流这样切分吧结束符分到后面,也是合理吧 ...
(引用自3楼)

不像结束符,开头也会有这个东西。

出0入224汤圆

发表于 2022-8-30 08:28:16 来自手机 | 显示全部楼层
不是bug,各个语言都是这个逻辑。

出100入0汤圆

发表于 2022-8-30 09:21:01 | 显示全部楼层
我到觉得很合理啊!

有没有和我一样觉得合理的?

出0入17汤圆

发表于 2022-8-30 09:30:33 来自手机 | 显示全部楼层
s.strip().split()

出0入25汤圆

发表于 2022-8-30 09:41:39 | 显示全部楼层
本帖最后由 XIVN1987 于 2022-8-30 09:57 编辑

搜了下发现用removeprefix、removesuffix比较好。。不过这两个方法都是 Python 3.9 新添加的

出0入0汤圆

发表于 2022-8-30 09:55:38 | 显示全部楼层
你重写也太复杂了,你判断最后一个字符是不是分隔符,是的话,删除,再split,或者先split,再判断最后一个字符串是不是空,是空删除就行了,这样又简洁又易懂。

出0入0汤圆

发表于 2022-8-30 10:13:45 | 显示全部楼层
正常就是这样,如果第1个字符为c,那么最左边也会分隔出1个空字符串,VB的split函数也是这样,做过很多字符串处理,感觉这样分隔很有用

出0入58汤圆

发表于 2022-8-30 11:17:18 | 显示全部楼层
xunke 发表于 2022-8-30 08:23
没有空格,并且与空格无关。
(引用自9楼)

可以trim分割字符

出0入0汤圆

发表于 2022-8-30 13:03:45 | 显示全部楼层
不是 bug, 一般 split 函数默认的逻辑就是这样的

特殊情况有的语言可以加额外参数,像 C# 里可以通过使用 StringSplitOptions.RemoveEmptyEntries 选项把空的项目移除
https://docs.microsoft.com/zh-cn ... ptions?view=net-6.0

出200入2554汤圆

发表于 2022-8-30 13:15:14 | 显示全部楼层
这让用惯了 strtok 和 tokenize 的情何以堪...

出0入112汤圆

 楼主| 发表于 2022-9-1 16:45:33 | 显示全部楼层
谢谢以上各位高手的回复!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-29 17:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表