def filter_non_digits(string: str) -> str:
result = ''
for char in string:
if char in '1234567890':
result += char
return result
解释
让我们创建一个非常基本的基准来测试已经提出的几种不同的方法。
For循环方法(我的想法)。 1.从Jon Clements的回答中列出理解方法。
RegEx方法来自Moradnejad的回答。
# filters.py
import re
# For loop method
def filter_non_digits_for(string: str) -> str:
result = ''
for char in string:
if char in '1234567890':
result += char
return result
# Comprehension method
def filter_non_digits_comp(s: str) -> str:
return ''.join(ch for ch in s if ch.isdigit())
# RegEx method
def filter_non_digits_re(string: str) -> str:
return re.sub('[^\d]','', string)
# tests.py
import time, platform
from filters import filter_non_digits_re,
filter_non_digits_comp,
filter_non_digits_for
def benchmark_func(func):
start = time.time()
# the "_" in the number just makes it more readable
for i in range(100_000):
func('afes098u98sfe')
end = time.time()
return (end-start)/100_000
def bench_all():
print(f'# System ({platform.system()} {platform.machine()})')
print(f'# Python {platform.python_version()}\n')
tests = [
filter_non_digits_re,
filter_non_digits_comp,
filter_non_digits_for,
]
for t in tests:
duration = benchmark_func(t)
ns = round(duration * 1_000_000_000)
print(f'{t.__name__.ljust(30)} {str(ns).rjust(6)} ns/op')
if __name__ == "__main__":
bench_all()
添加到@MoradneJad中。您可以使用下面的代码来提取整数值、浮点数甚至是有符号值。 a = re.findall(r"[-+]?\d*\.\d+|\d+", "Over th44e same pe14.1riod of time, p-0.8rices also rose by 82.8p") 然后,您可以使用map有效地将列表项转换为数字数据类型。 print(list(map(float, a))) [44.0, 14.1, -0.8, 82.8]
9条答案
按热度按时间dzhpxtsq1#
我不会为此使用RegEx。它要慢得多!
相反,让我们使用一个简单的
for
循环。顶级域名;
此功能将快速完成工作...
解释
让我们创建一个非常基本的基准来测试已经提出的几种不同的方法。
1.从Jon Clements的回答中列出理解方法。
现在我们已经实现了每种删除数字的方法,下面让我们对每种方法进行基准测试。
下面是一些非常基本的基准测试代码。但是,它可以给予我们很好地比较每种方法的性能。
下面是基准测试代码的输出。
正如你所看到的,
filter_non_digits_for()
函数比使用RegEx快四倍多,大约是解析方法的两倍。有时简单是最好的。zazmityj2#
您可以使用
string.ascii_letters
来识别非数字:如果要替换冒号,请使用引号
"
而不是冒号'
。mcdcgff03#
提取整数
提取单个浮点数/整型数(可能是小数分隔符)
提取多个浮点数/浮点数
i5desfxk4#
添加到@MoradneJad中。您可以使用下面的代码来提取整数值、浮点数甚至是有符号值。
a = re.findall(r"[-+]?\d*\.\d+|\d+", "Over th44e same pe14.1riod of time, p-0.8rices also rose by 82.8p")
然后,您可以使用
map
有效地将列表项转换为数字数据类型。print(list(map(float, a)))
[44.0, 14.1, -0.8, 82.8]
qmb5sa225#
结果〉〉〉'676378'
vaqhlq816#
转换所有带或不带单位缩写的数字字符串。必须通过参数dec =','指明源字符串是十进制逗号表示法。可以转换为浮点数和整数。默认转换为浮点数,但将参数设置为Int =True,则结果为整数。自动识别可在md字典中编辑的单位缩写。关键是单位缩写,值是乘数。这样,这个函数的应用就无穷无尽了。结果总是一个你可以计算的数字。这种集所有功能于一体的方法不是最快的,但你再也不用担心了,它总是返回一个可靠的结果。
调用函数如下:
输出结果:
wrrgggsh7#
最简单的方法是使用正则表达式
fzwojiic8#
逐个字符循环字符串,并且只包含数字:
或者在字符串上使用正则表达式(如果在某个时候你想单独处理不连续的组)...
然后就
print
他们出来了:ffvjumwh9#
有一个内置的。
字符串.translate(s,表[,删除字符])
从中删除deletechars中的所有字符(如果存在),然后使用table转换字符,table必须是一个256个字符的字符串,提供每个字符值的转换,并按其序号进行索引。如果table为None,则只执行字符删除步骤。
或者,您可以在不导入的情况下执行此操作(但没有这样做的理由):