求教python高手:一个简单的问题,lstrip函数切割错误

兔子爱读书
博客专家认证
2015-08-08 10:23:54
原本代码如下,

#coding: utf-8
oldStr = "1000\t1112\n"
newStr = oldStr
t=newStr.index("\t")
newStr = newStr.lstrip(newStr[0:t])
]newStr = newStr.lstrip("\t")
newStr = newStr.rstrip("\n")
if int(newStr)>1000:
print 'ok'
else:
print 'sorry'

可正常显示结果“OK”。
现在想省中间一步,将.lstrip(newStr[0:t]) 与 newStr.lstrip("\t")合并:

#coding: utf-8
oldStr = "1000\t1112\n"
newStr = oldStr
t=newStr.index("\t")
newStr = newStr.lstrip(newStr[0:t+1])
newStr = newStr.rstrip("\n")
if int(newStr)>1000:
print 'ok'
else:
print 'sorry'

结果显示为:sorry。很明显在t 变为t+1的时候,lstrip()不仅仅删除了\t.
在命令行一行一行搜查,结果如下:

字符串切割显示没错,但是一调用lstrip()就得不到想要的结果,这是为什么呢?
...全文
413 8 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lxw19900109 2016-12-15
太赞了! @ehes73
  • 打赏
  • 举报
回复
兔子爱读书 2015-08-14
已经被楼上震惊了,谢@ehes73 这么严谨地答疑解惑。“直至第一个不在chars中的字符”是此贴精髓,至此完全明白了。
  • 打赏
  • 举报
回复
ehes73 2015-08-10
拿了楼主10分,既然还有疑问,那就要对得起你这10分,帮忙帮到底: 一、问题出在你对lstrip的理解上 先看看Python的lstrip文档 Return a copy of the string with leading characters removed. The chars argument is a string specifying the set of characters to be removed. If omitted or None, the chars argument defaults to removing whitespace. The chars argument is not a prefix; rather, all combinations of its values are stripped 翻译就免了,重点是: 1、chars是一个集合,字符的集合 2、chars不是一个前缀,而是所有包含在chars中的都会被移除(直至第一个不在chars中的字符-我的补充) 现在看看下面的例子
"1000\t1112\n".lstrip("1")   # "000\t1112\n"
"1000\t1112\n".lstrip("0")   # "1000\t1112\n"
"1000\t1112\n".lstrip("10")   # "\t1112\n"
"1000\t1112\n".lstrip("10\t")    # "2\n"
"1000\t1112\n".lstrip("1000\t")  # "2\n"
应该能清晰看到lstrip的功能了,再来看楼主的例子:
oldStr = "1000\t1112\n"  
newStr = oldStr   
t=newStr.index("\t")   # t : 4
# newStr = newStr.lstrip(newStr[0:t+1])  # 将这一行分解为下面两行
temp = newStr[0:t+1]  # temp: '1000\t'
newStr = newStr.lstrip(temp)   # newStr: '2\n'
newStr = newStr.rstrip("\n")   # newStr: '2'
至此,应该完全清楚问题在哪了吧! 二、误导1
引用 1 楼 zzgzzg00 的回复:
#coding: utf-8
oldStr = "1000\t1112\n"  
newStr = oldStr   
t=newStr.index("\t")
newStr=newStr.lstrip(newStr[0:t])  # 跟楼主犯了同样的错误,只不过因为没有包含\t碰巧得到了“正确”的结果
newStr = newStr.rstrip("\n")
if int(newStr)>1000:  # 又碰巧int('\t1122') == str('1122'),如果条件变成newStr == '1122'那就杯具了
    print 'ok'  
else:  
    print 'sorry' 
三、误导2
引用 5 楼 ztf312 的回复:
糊涂了,根本就是strip()函数用错了,跟转义没关系。大家不要被误导。
哪来的文档?其中的“位于”害死人了
  • 打赏
  • 举报
回复
兔子爱读书 2015-08-09
糊涂了,根本就是strip()函数用错了,跟转义没关系。大家不要被误导。
  • 打赏
  • 举报
回复
兔子爱读书 2015-08-09
好像还有点小问题,为什么@ehes73 的解释不存在转义占位的问题?
  • 打赏
  • 举报
回复
兔子爱读书 2015-08-09
感谢@似梦飞花 给我的启发。这个问题事实上玄机在于“\t”. lstrip()在调用时是可以识别转义字符的,“\t”作为字符串的一个元素只占一个位置,但是转义后占了四个位置,于是“\t1112”被删掉前四格只剩下了“2”,可见python中Tab要小心使用。测试过程如下:

谢谢@ehes73 的简洁解决方案,速度加快了0.1秒,向你学习!
  • 打赏
  • 举报
回复
ehes73 2015-08-09
看你折腾的这么辛苦:

#coding: utf-8
oldStr = "1000\t1112\n"  
newStr = oldStr[oldStr.index('\t'):].lstrip('\t').rstrip('\n')
if int(newStr)>1000:  
    print 'ok'  
else:  
    print 'sorry' 
一句话描述:取\t开始的后续字符串,去掉前导\t,去掉后续\n
  • 打赏
  • 举报
回复
似梦飞花 2015-08-08
#coding: utf-8
oldStr = "1000\t1112\n"  
newStr = oldStr   
t=newStr.index("\t")
newStr=newStr.lstrip(newStr[0:t])
newStr = newStr.rstrip("\n")
if int(newStr)>1000:  
    print 'ok'  
else:  
    print 'sorry' 
  • 打赏
  • 举报
回复
相关推荐
发帖
脚本语言

3.7w+

社区成员

JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • ITBOB • 鲍勃
加入社区
帖子事件
创建了帖子
2015-08-08 10:23