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

时间:2023-02-10 15:24:16
原本代码如下,

#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.
在命令行一行一行搜查,结果如下:
求教python高手:一个简单的问题,lstrip函数切割错误
字符串切割显示没错,但是一调用lstrip()就得不到想要的结果,这是为什么呢?

8 个解决方案

#1


#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' 

#2


看你折腾的这么辛苦:

#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

#3


感谢@似梦飞花 给我的启发。这个问题事实上玄机在于“\t”. lstrip()在调用时是可以识别转义字符的,“\t”作为字符串的一个元素只占一个位置,但是转义后占了四个位置,于是“\t1112”被删掉前四格只剩下了“2”,可见python中Tab要小心使用。测试过程如下:
求教python高手:一个简单的问题,lstrip函数切割错误
谢谢@ehes73 的简洁解决方案,速度加快了0.1秒,向你学习!

#4


好像还有点小问题,为什么@ehes73 的解释不存在转义占位的问题?

#5


糊涂了,根本就是strip()函数用错了,跟转义没关系。大家不要被误导。
求教python高手:一个简单的问题,lstrip函数切割错误

#6


拿了楼主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()函数用错了,跟转义没关系。大家不要被误导。
求教python高手:一个简单的问题,lstrip函数切割错误

哪来的文档?其中的“位于”害死人了

#7


已经被楼上震惊了,谢@ehes73 这么严谨地答疑解惑。“直至第一个不在chars中的字符”是此贴精髓,至此完全明白了。 求教python高手:一个简单的问题,lstrip函数切割错误

#8


太赞了! @ehes73

#1


#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' 

#2


看你折腾的这么辛苦:

#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

#3


感谢@似梦飞花 给我的启发。这个问题事实上玄机在于“\t”. lstrip()在调用时是可以识别转义字符的,“\t”作为字符串的一个元素只占一个位置,但是转义后占了四个位置,于是“\t1112”被删掉前四格只剩下了“2”,可见python中Tab要小心使用。测试过程如下:
求教python高手:一个简单的问题,lstrip函数切割错误
谢谢@ehes73 的简洁解决方案,速度加快了0.1秒,向你学习!

#4


好像还有点小问题,为什么@ehes73 的解释不存在转义占位的问题?

#5


糊涂了,根本就是strip()函数用错了,跟转义没关系。大家不要被误导。
求教python高手:一个简单的问题,lstrip函数切割错误

#6


拿了楼主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()函数用错了,跟转义没关系。大家不要被误导。
求教python高手:一个简单的问题,lstrip函数切割错误

哪来的文档?其中的“位于”害死人了

#7


已经被楼上震惊了,谢@ehes73 这么严谨地答疑解惑。“直至第一个不在chars中的字符”是此贴精髓,至此完全明白了。 求教python高手:一个简单的问题,lstrip函数切割错误

#8


太赞了! @ehes73