我们有一堆字符串,例如:c1309
, IF1306
, v1309
, p1209
, a1309
, mo1309
。
在 Python 中,去除数字的最佳方法是什么?我只需要:c
, IF
, v
, p
, a
,mo
来自上面的例子。
问问题
3523 次
8 回答
27
您可以使用regex
:
>>> import re
>>> strs = "c1309, IF1306, v1309, p1209, a1309, mo1309"
>>> re.sub(r'\d','',strs)
'c, IF, v, p, a, mo'
或更快的版本:
>>> re.sub(r'\d+','',strs)
'c, IF, v, p, a, mo'
timeit
比较:
>>> strs = "c1309, IF1306, v1309, p1209, a1309, mo1309"*10**5
>>> %timeit re.sub(r'\d','',strs)
1 loops, best of 3: 1.23 s per loop
>>> %timeit re.sub(r'\d+','',strs)
1 loops, best of 3: 480 ms per loop
>>> %timeit ''.join([c for c in strs if not c.isdigit()])
1 loops, best of 3: 1.07 s per loop
#winner
>>> %timeit from string import digits;strs.translate(None, digits)
10 loops, best of 3: 20.4 ms per loop
于 2013-05-31T03:02:56.967 回答
22
>>> text = 'mo1309'
>>> ''.join([c for c in text if not c.isdigit()])
'mo'
这比正则表达式快
python -m timeit -s "import re; text = 'mo1309'" "re.sub(r'\d','',text)"
100000 loops, best of 3: 3.99 usec per loop
python -m timeit -s "import re; text = 'mo1309'" "''.join([c for c in text if not c.isdigit()])"
1000000 loops, best of 3: 1.42 usec per loop
python -m timeit -s "from string import digits; text = 'mo1309'" "text.translate(None, digits)"
1000000 loops, best of 3: 0.42 usec per loop
但str.translate
正如@DavidSousa所建议的那样:
from string import digits
text.translate(None, digits)
在剥离字符方面总是最快的。
还itertools
提供了一个鲜为人知的功能,称为ifilterfalse
>>> from itertools import ifilterfalse
>>> ''.join(ifilterfalse(str.isdigit, text))
'mo'
于 2013-05-31T03:04:05.147 回答
13
我认为字符串方法translate
比加入列表等更优雅。
from string import digits # digits = '0123456789'
list1 = ['c1309', 'IF1306', 'v1309', 'p1209', 'a1309', 'mo1309']
list2 = [ i.translate(None, digits) for i in list1 ]
于 2013-05-31T03:08:25.040 回答
3
我认为这是最简单的,也可能是最快的。
>>> import string
>>> s = 'c1309, IF1306, v1309, p1209, a1309, mo1309'
>>> s.translate(None, string.digits)
'c, IF, v, p, a, mo'
注意:接口的str.translate
被更改为使用python3中的映射,所以这里是3版本
s.translate({ord(n): None for n in string.digits})
或者更明确的替代方案:
m = str.maketrans('', '', string.digits)
s.translate(m)
于 2013-05-31T03:18:19.910 回答
1
如果您正在处理的所有字符串都以一个数字结尾,那么您可以从字面上理解strip
这个数字:
>>> strings = ['c1309', 'IF1306', 'v1309', 'p1209', 'a1309', 'mo1309']
>>> [s.strip("0123456789") for s in strings]
['c', 'IF', 'v', 'p', 'a', 'mo']
如果您只想删除字符串末尾的数字rstrip
,请使用. 如果数字可能出现在字符串中,则此方法根本不起作用。
于 2013-05-31T10:37:29.787 回答
1
strings = ['c1309', 'IF1306', 'v1309', 'p1209', 'a1309', 'mo1309']
stripped = [''.join(c for c in s if not c.isdigit()) for s in strings]
于 2013-05-31T03:10:18.523 回答
0
你可以试试这个正则表达式:
^[a-zA-Z]+
它只需要连续的字母from start
并忽略字符串中的所有其他内容。
无需更换。
于 2013-05-31T04:56:41.930 回答
0
如果数字长度是固定的并且位置不在字符串的中间,则使用切片表示法。
NUM_LEN = 4
stringsWithDigit = ["ab1234", "cde1234", "fgh5678"]
for i in stringsWithDigit:
print i[:-NUM_LEN]
还要别的吗
import re
c = re.compile("[^0-9]+")
print c.findall("".join(stringsWithDigit))
于 2013-05-31T03:37:10.667 回答