鱼C论坛

 找回密码
 立即注册
查看: 4505|回复: 12

有关字符串的expandtabs方法

[复制链接]
发表于 2015-4-5 23:08:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
楼主表示是一名新手,有关字符串的这个expandtabs方法不是很明白。
比如说:
str8 = 'I love your\tcat'
>>> str8.expandtabs()
返回值会是'I love your     cat'                     #\t转换成了9个空格?(your加上5个空格)

再比如说:
str3 = '1 2 3 4\t5'
>>> str3
'1 2 3 4\t5'

str3.expandtabs()
'1 2 3 4 5'                                                    #这个又是转换成了什么?【晕】

这个expandtabs()默认tabsize是8呀,为什么会有这些返回值呢?新手表示不太明白,求各位解答。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-4-5 23:34:51 | 显示全部楼层
噢...我刚才忽然感觉想明白了,尝试了一下感觉是不是这样。这个方法会把出现的第一个\t一直数到字符串开头,不改默认值的情况下数够8位就从头数,不够再补齐。后面再有\t再从前一个\t后面数起。是不是这样?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-7 12:31:40 | 显示全部楼层
求回复啊...自己来顶一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-7 17:45:10 | 显示全部楼层
本帖最后由 lightninng 于 2015-4-7 17:47 编辑
netikid 发表于 2015-4-7 12:31
求回复啊...自己来顶一下

楼主在二楼里说的很对,\t = tab键,是制表符,就是你每次使用tab,下 一次光标的位置在下一栏的起始位置,比如一般是一个tab四个空格位,如果你已经输入了两个字母,那么按下tab,光标的位置就来到了字母后面两个空格的位置,输出效果上"ab\tcd"和"ab  cd"是一样的,所以这个expandtab也是这样,到上一个tab位或者行首一共数8个字符位,不够补齐空格

修正一下,好像是到上一个空格位,然后数字不算,刚试了下
  1. >>> str8 = 'I love your 3\tcat'
  2. >>> str8.expandtabs()
  3. 'I love your 3   cat'
复制代码



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-7 19:29:52 | 显示全部楼层
lightninng 发表于 2015-4-7 17:45
楼主在二楼里说的很对,\t = tab键,是制表符,就是你每次使用tab,下 一次光标的位置在下一栏的起始位置 ...

谢谢回复!顺便问下“到上一个空格位,然后数字不算”什么意思呀,我是新手
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-7 19:35:22 | 显示全部楼层
你最后一个例子,每个空格都会和一个数字相隔对吧,但是4和5之前的\t并没有变成7个空格加上5,而是原封不动,但是第一个例子中的\t变成了五个空格+cat,所以我猜测它把数字并没有算在其内,看我试验的例子,我在你的第一个例子中加了一个3结果依然是从your的r到cat的t一个八个字符,不足的补的空格,3被保留了下来,不知道这样说你明白没有
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-7 19:38:40 | 显示全部楼层
lightninng 发表于 2015-4-7 19:35
你最后一个例子,每个空格都会和一个数字相隔对吧,但是4和5之前的\t并没有变成7个空格加上5,而是原封不动 ...

我觉得第二个例子是从开始的1数到\t前有7位,所以\t转为1位空格。这样就是从头数8位了..
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2015-4-7 19:39:57 | 显示全部楼层
本帖最后由 netikid 于 2015-4-7 19:41 编辑
lightninng 发表于 2015-4-7 19:35
你最后一个例子,每个空格都会和一个数字相隔对吧,但是4和5之前的\t并没有变成7个空格加上5,而是原封不动 ...
你加了3之后,从头开始数,共数了两遍8..第一编是I love y,第二遍是剩下的,补了3个空格。。我感觉是这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2015-4-7 21:54:04 | 显示全部楼层
netikid 发表于 2015-4-7 19:39
你加了3之后,从头开始数,共数了两遍8位..第一编是I love y,第二遍是剩下的,补了3个空格。。我感觉是这 ...

你说的对,是我理解错了,确实是找到下一个n*8的字符位置,这样理解也比较符合制表符的意义 ~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-10 16:50:32 | 显示全部楼层
刚看完小甲鱼第14讲的内容,看到字符串的这个expandtabs方法时就没有看懂,来论坛上找了找,你的帖子应该是解释得最好的了,多谢!
我再总结一下:当使用字符串的这个expandtabs函数时,默认8个字符为1个Tab,expandtabs函数会把字符串中转义字符\t转化成空格,且从字符串的开头开始算起,以8位为1个循环,而不是简单地用8个空格来替代\t,倘若在这8个位里有之前原始的字符串里的字符,则不用空格替换,不够8位的时候才用空格去补充。例子我就不再给出了,小甲鱼的视频里和楼主以及上一位回答者都已经给出。大家可以亲自尝试一下就会明白了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2017-1-10 21:25:30 | 显示全部楼层
netikid 发表于 2015-4-7 19:39
你加了3之后,从头开始数,共数了两遍8位..第一编是I love y,第二遍是剩下的,补了3个空格。。我感觉是这 ...

刚好我也碰到了这个问题,两位说的对,不过一开始走了些弯路,我举了简单的例子在下面供其他鱼油参考,我认为多举些简单例子更具有说服力。总的来说,参数是长度,从头开始数,数到第一个\t正好为一个长度,不足则补空格,如果还有\t,接着数到第二个\t仍然为一个长度,以此类推知道最后一个\t结束,后面的不管,举的例子也许还不具有一般性,还望指摘。
>>> str = 'I\tlove\tyou!'
>>> str.expandtabs(0)
'Iloveyou!'
>>> str.expandtabs(1)
'I love you!'
>>> str.expandtabs(2)
'I love  you!'
>>> str.expandtabs(3)
'I  love  you!'
>>> str.expandtabs(4)
'I   love    you!'
>>> str.expandtabs(5)
'I    love you!'
>>> str.expandtabs(6)
'I     love  you!'
>>> str.expandtabs(7)
'I      love   you!'
>>> str.expandtabs(8)
'I       love    you!'
>>> str.expandtabs(9)
'I        love     you!'
>>> str.expandtabs(10)
'I         love      you!'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-11-12 18:45:33 | 显示全部楼层
Shiryan 发表于 2016-12-10 16:50
刚看完小甲鱼第14讲的内容,看到字符串的这个expandtabs方法时就没有看懂,来论坛上找了找,你的帖子应该是 ...

非常感谢!TVT
表示这个帖子看懂了,但是下面这个帖子还是没能看懂……
http://bbs.fishc.com/forum.php?m ... ighlight=expandtabs
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-11 11:40:11 | 显示全部楼层
我的个人总结,参考下
#expandtabs( ) 把字符串中的 tab 符号('\t')转为空格
#函数参数默认为8,注意字符串原有的空格也参与计算长度

test = "LinGou\tLinGengxin"
v1 = test.expandtabs( )
#这里是根据字符串的长度计算,expandtabs( )默认为8,执行方式如下
#"LinGou\tLinGengxin"
#LinGou是6个字符,此时遇到\t,expandtabs( )默认为8,要补全2个字符长度,即6+2=8,
#\t之后的字符不用处理
print(v1)

v2 = test.expandtabs(6)
#同样的这里也是这样执行,参数为6,
# 字符串从左到右6个字符一组,LinGou是6个字符,忽略不作处理直接输出,此时遇到\t,
# 前面没有字符参与计算长度,此时需要\t直接输出6个空格
#\t之后的字符不用处理
print(v2)

v3=  test.expandtabs(7)
#参数为7,LinGou是6个字符,此时需要补全1个空格即可
#注意这里的空格是expandtabs()输出的,不是自带的
print(v3)


test2 = "LinGou\t wang \twang"
v4 =test2.expandtabs(7)
#字符串原有的空格也参与计算长度
#参数为7,LinGou是6个字符,遇到第一个\t,此时需要补全1个空格即可
#继续计算,第一个\t输出一个空格,之后有一个字符串自带的空格,
#1个自带空格+wang(4个字符)+1个自带空格=6个长度,遇到\t,此时补全1个空格即可
#第二个\t之后的字符不用处理
print(v4)


test3 = "123456\t789012345\t67890"
v5 =test3.expandtabs(6)
#参数为6,计算字符长度,123456长度为6,直接输出不做处理,
# 前面没有字符参与计算长度,此时需要\t直接输出6个空格
#继续计算,789012,长度为6,直接输出不做处理,
# 继续计算,345长度为3,遇到\t,此时需要补全3个空格
#第二个\t之后的字符不用处理
print(v5)



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 15:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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