Python str.rstrip()函数中的错误,还是我自己的愚蠢?

时间:2011-06-25 18:17:48

标签: python string strip

这是一个错误,或者我即将学习有关Python行为方式的新内容。 :)

我有一个充满键/值对的字典。每个密钥都有一个唯一的前缀 ias_XX_XX_ 。我正在尝试获取字典中每个唯一前缀的列表。

  1. 首先,我获得以'_x1'结尾的所有密钥的列表。
  2. 接下来,我使用'_x1')从所有这些中删除rstrip('_x1'
  3. 除了最后一个ias_1_1_x1之外,这对所有人都适用。它不会被剥离到ias_1_1,而是变为ias_。运行代码以便自己查看:

    d = {
    'ias_16_10_x2':     575, 
    'ias_16_10_x1':     0, 
    'ias_16_10_y1':     0, 
    'ias_16_10_y2':     359,
    'ias_16_9_x2':      575, 
    'ias_16_9_x1':      0, 
    'ias_16_9_y1':      18, 
    'ias_16_9_y2':      341, 
    'ias_1_1_y1':       0, 
    'ias_1_1_y2':       359,  
    'ias_1_1_x2':       467, 
    'ias_1_1_x1':       108,
    }
    
    x1_key_matches = [key for key in d if '_x1' in key]
    print x1_key_matches
    
    unique_ids = []
    for x1_field in x1_key_matches:
        unique_ids.append(x1_field.rstrip('_x1'))
    
    print unique_ids
    

    实际输出 :( Python 2.6,2.7和3.2(必须更改print to print()才能使用3.x)

    ['ias_16_10_x1', 'ias_16_9_x1', 'ias_1_1_x1']
    ['ias_16_10', 'ias_16_9', 'ias']   # <<<--- Why isn't this last one ias_1_1???
    

    预期输出:

    ['ias_16_10_x1', 'ias_16_9_x1', 'ias_1_1_x1']
    ['ias_16_10', 'ias_16_9', 'ias_1_1']
    

    如果我将密钥的名称从ias_1_1更改为ias_1_2ias_1_3,则不会出现故障。为什么会这样?

6 个答案:

答案 0 :(得分:20)

rstrip()的参数是要剥离的一组字符,而不是精确的字符串:

>>> "abcbcbaba".rstrip("ab")
"abcbc"

一般提示:如果您怀疑某些功能存在错误,请阅读documentation

答案 1 :(得分:5)

docs开始强调:

  

chars参数是一个字符串,指定要删除的字符集。如果省略或None,则chars参数默认为删除空格。 chars参数不是后缀;相反,它的所有值组合都被剥离了。

答案 2 :(得分:4)

.rstrip的参数不是我们要删除的字符串,而是我们要删除的字符。检查一下示例:

>>> "12345678".rstrip("158")
'1234567'
>>> "12345678".rstrip("asd8qwe")
'1234567'
>>> "12345678".rstrip("78")
'123456'
>>> "1234568788".rstrip("78")
'123456'

答案 3 :(得分:3)

.rstrip()删除匹配字符的所有组合,您提供的实际字符串。请参阅http://docs.python.org/library/stdtypes.html

答案 4 :(得分:2)

试试这个:

unique_ids.append(re.sub('_x1$', '', x1_field)

答案 5 :(得分:0)

rstrip 会返回删除了尾随字符的字符串副本。

例如:

>>> '   spacious   '.rstrip()
'   spacious'
>>> "AABAA".rstrip("A")
'AAB'
>>> "ABBA".rstrip("AB") # both AB and BA are stripped
''
>>> "ABCABBA".rstrip("AB")
'ABC'

########

>>> '   spacious   '.rstrip()
'   spacious'
>>> 'mississippi'.rstrip('ipz')
'mississ'

如果您要处理文件名,请格外小心,

>>> "cosmac.csv".replace(".csv")
'cosma'
>>> "cosmac.csv".replace(".csv", "")
'cosmac'

希望这有帮助!