我们有一些字符串,例如:
在Python中,最好的方法是什么来剥离出这些数字?我只需要从上面的例子中得到:
c1309
、IF1306
、v1309
、p1209
、a1309
、mo1309
。在Python中,最好的方法是什么来剥离出这些数字?我只需要从上面的例子中得到:
c
、IF
、v
、p
、a
、mo
。正则表达式
:>>> 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
re.sub(r'\d+','',strs)
,以提高效率。 - Tim Pietzckerre.sub(r'[0-9]+','',strs)
会提高速度吗? - Grijesh Chauhan>>> 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
但是,正如@DavidSousa建议的那样,使用str.translate
:
from string import digits
text.translate(None, digits)
在去除字符方面,它始终是最快的。
itertools
还提供了一个鲜为人知的函数 ifilterfalse
>>> from itertools import ifilterfalse
>>> ''.join(ifilterfalse(str.isdigit, text))
'mo'
join
比使用生成器表达式的 join
更快吗? - Blender我认为字符串方法translate
比拼接列表等更加优雅。
from string import digits # digits = '0123456789'
list1 = ['c1309', 'IF1306', 'v1309', 'p1209', 'a1309', 'mo1309']
list2 = [ i.translate(None, digits) for i in list1 ]
from string import digits
更好(不确定为什么你改了它)。这是在Python 2中最快的方法,可能在Python 3中更优雅的方式是:text.translate(str.maketrans('', '', digits))
。 - jamylak我认为这是最简单的方法,也可能是最快的方法。
>>> import string
>>> s = 'c1309, IF1306, v1309, p1209, a1309, mo1309'
>>> s.translate(None, string.digits)
'c, IF, v, p, a, mo'
str.translate
的接口已更改为使用映射,因此以下是适用于Python3的版本。s.translate({ord(n): None for n in string.digits})
m = str.maketrans('', '', string.digits)
s.translate(m)
strings = ['c1309', 'IF1306', 'v1309', 'p1209', 'a1309', 'mo1309']
stripped = [''.join(c for c in s if not c.isdigit()) for s in strings]
>>> strings = ['c1309', 'IF1306', 'v1309', 'p1209', 'a1309', 'mo1309']
>>> [s.strip("0123456789") for s in strings]
['c', 'IF', 'v', 'p', 'a', 'mo']
rstrip
。如果数字可能出现在字符串中,则此方法将无法起作用。0123456789
替换为string.digits
。 - iruvar如果数字长度固定且位置不在字符串中间,请使用切片符号。
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))
^[a-zA-Z]+
它将仅获取字符串中连续的字母从开头开始
,并忽略所有其他内容。
不需要进行替换。
reversed_string = original_string[::-1]
- jamylak