使用Python去掉字符串开头的数字?

4

我看到很多问题问如何从字符串中去掉前导零,但我没有看到任何一个问题问如何从字符串中去掉所有前导数字。

我一直在尝试使用 lstriptype 函数、isdigit、切片符号和正则表达式的组合,但还没有找到方法。

有没有简单的方法可以做到这一点呢?

例如:

  • "123ABCDEF" 应该变成 "ABCDEF"
  • "ABCDEF" 应该保持为 "ABCDEF"
  • "1A1" 应该变成 "A1"
  • "12AB3456CD" 应该变成 "AB3456CD"
3个回答

15
一个简单的方法是使用 string.digits 来表示所有数字,它可以很方便地提供一个包含所有数字字符'0123456789'的字符串,然后再用string.lstrip去除。
>>> from string import digits
>>> s = '123dog12'
>>> s.lstrip(digits)
'dog12'

7
我想指出,尽管Mitch和RebelWithoutAPulse的答案都是正确的,但它们并不做相同的事情。
Mitch的答案会剥离集合'1'、'2'、'3'、'4'、'5'、'6'、'7'、'8'、'9'、'0'中的任何字符。
>>> from string import digits
>>> digits
'0123456789'
>>> '123dog12'.lstrip(digits)
'dog12'

另一方面,RevelWithoutAPulse的答案会去除任何已知为数字的字符。

>>> import re
>>> re.sub('^\d+', '', '123dog12')
'dog12'

那么有什么区别呢?嗯,有两个不同之处:

  • 除了印度-阿拉伯数字之外,还有许多其他数字字符
  • lstrip 在 RTL 语言上是模糊的。实际上,它会删除前导匹配字符,这些字符可能在右侧。使用正则表达式的 ^ 操作符更加直观。

以下是一些示例:

>>> '١٩٨٤فوبار٤٢'.lstrip(digits)
'١٩٨٤فوبار٤٢'
>>> re.sub('^\d+', '', '١٩٨٤فوبار٤٢')
'فوبار٤٢'

>>> 'foobar'.lstrip(digits)
'foobar'
>>> re.sub('^\d+', '', 'foobar')
'foobar'

所以...我想结论是要根据您想要做什么选择正确的解决方案。

(对于阿拉伯语示例的注释,阅读从右到左,因此正确的操作是删除右侧的数字)


这是值得注意的,如果我的回答的限制至少不是隐含的 :) - miradulo

1

使用来自re的正则表达式:

import re
re.sub('^\d+', '', '1234AB456')

成为:

'AB456'

用空字符串替换字符串开头的任意数量的正数位数字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接