【问题标题】:Removing a prefix from a string从字符串中删除前缀
【发布时间】:2011-05-08 03:09:35
【问题描述】:

试图从二进制数的左端去除“0b1”。

以下代码导致剥离所有二进制对象。 (不好)

>>> bbn = '0b1000101110100010111010001' #converted bin(2**24+**2^24/11)
>>> aan=bbn.lstrip("0b1")  #Try stripping all left-end junk at once.
>>> print aan    #oops all gone.
''

所以我分两步完成了 .lstrip():

>>> bbn = '0b1000101110100010111010001' #    Same fraction expqansion
>>> aan=bbn.lstrip("0b")# Had done this before.
>>> print aan    #Extra "1" still there.
'1000101110100010111010001'
>>> aan=aan.lstrip("1")#  If at first you don't succeed...
>>> print aan    #YES!
'000101110100010111010001'

怎么了?

再次感谢您通过一个简单的步骤解决此问题。 (见我之前的问题)

【问题讨论】:

标签: python string


【解决方案1】:
>>> i = 0b1000101110100010111010001
>>> print(bin(i))
'0b1000101110100010111010001'

>>> print(format(i, '#b'))
'0b1000101110100010111010001'
>>> print(format(i, 'b'))
'1000101110100010111010001'

Example in python tutor:

来自标准文档 (See standard documentation for function bin()): 仓(x) 将整数转换为前缀为“0b”的二进制字符串。结果是一个有效的 Python 表达式。如果 x 不是 Python int 对象,它必须定义一个返回整数的 index() 方法。一些例子:

>>> bin(3)
'0b11'
>>> bin(-10)
'-0b1010'

无论是否需要前缀“0b”,您可以使用以下任一方式。

>>> format(14, '#b'), format(14, 'b')
('0b1110', '1110')
>>> f'{14:#b}', f'{14:b}'
('0b1110', '1110')

有关详细信息,另请参阅 format()。

【讨论】:

    【解决方案2】:

    In Python 3.9 你可以使用bbn.removeprefix('0b1')

    (其实这个问题已经mentioned作为PEP 616的基本原理的一部分。)

    【讨论】:

      【解决方案3】:

      @Harryooo: lstrip 仅将字符从左端取出。所以,因为在第一个 0 之前只有一个 1,所以它会删除它。如果号码以0b11100101... 开头,则调用a.strip('0b').strip('1') 将删除前三个号码,因此您将剩下00101

      【讨论】:

        【解决方案4】:

        Lstrip 正在删除字符串中的任何字符。因此,除了最初的 0b1 之外,它还删除了所有的零和所有的一。因此,一切都消失了!

        【讨论】:

        • 是的,但为什么第二种情况只有第一个“1”?
        【解决方案5】:

        strip 系列将 arg 视为要删除的 一组 字符。默认设置为“所有空白字符”。

        你想要:

        if strg.startswith("0b1"):
           strg = strg[3:]
        

        【讨论】:

        • 是的,但为什么第二种情况只有第一个“1”?
        • @Harryooo:问你一个问题:为什么 Python 既有 lstrip 和 rstrip 又有结合 lstrip 和 rstrip 功能的条?
        【解决方案6】:

        这就是lstrip 的工作方式。它会删除参数中的任何 个字符,而不一定是整个字符串。在第一个示例中,由于输入仅包含这些字符,因此什么都没有。

        【讨论】:

        • 是的,但为什么第二种情况只有第一个“1”?
        • @Harryooo,在您的第二个示例中,lstrip("1") 删除左侧的字符,直到它到达不是 1 的内容。如果它以 '1111' 开头,它将全部删除。
        【解决方案7】:

        没有。剥离会删除传递序列中的所有字符,而不仅仅是文字序列。如果要删除固定长度,请对字符串进行切片。

        【讨论】:

        • 例如"ababbbbbbaaccc".lstrip("ab") => "ccc"
        • 我有点认为 lstrip() 使用 char 作为列表,但是当 lstrip("1") 只删除第一个“1”而不是其余部分时,我再次感到惊讶。跨度>
        • 那是因为左边只有一个1
        猜你喜欢
        • 2023-04-05
        • 1970-01-01
        • 2016-12-30
        • 2019-05-30
        • 1970-01-01
        • 2021-10-05
        • 2013-05-16
        • 2021-07-18
        相关资源
        最近更新 更多