在测试数据类型时,在for循环中使用regex的最佳方式是什么?
对于上下文,我循环遍历具有多种数据类型的大型不干净数据集,并且需要找到字符串的扩展,如果它们存在的话。对代码进行一些小的修改,比如将值转换为字符串需要花费几分钟的时间。
我通读了这个问题Python: How to use RegEx in an if statement?,但在没有首先转换为字符串的情况下找不到测试匹配的方法。
值:
vals = [444444, '555555-Z01']
pattern = re.compile('[-]*[A-Z]{1}[0-9]{2}$')
# new_vals = [444444, 555555]
慢速方式:(2.4µs±93.6 ns /环)
new_vals = []
for v in vals:
if type(v)==str:
if pattern.search(v) is not None:
new_v = pattern.findall(v)[0].replace('-','')
new_vals.append(new_v)
else:
new_vals.append(v)
快速方法:(1.84µs±34.7 ns /环)
f = lambda x: x if type(x)!=str else pattern.findall(x)[0].replace('-','')
new_vals = []
for v in vals:
new_vals.append(f(v))
失败的方法:
new_vals = []
for v in vals:
if ((type(v)==str) & (pattern.search(v) is not None)):
new_vals.append(v)
错误:
TypeError: expected string or bytes-like object
发布于 2019-05-29 03:23:34
我试图用try/except
块击败您的尝试,但异常处理似乎花费了太多时间。这就是“请求原谅胜过请求许可”的说法。
如果您只是将&
改为and
,那么您的最后一次尝试是最有希望的,因为&
是逻辑and,并且不会短路。
我将采用此方法,在列表理解中稍微提高速度,并删除无用的is not None
测试,因为如果search
成功,它将返回一个正则表达式对象,这是真的:
new_vals = [v for v in vals if type(v)==str and pattern.search(v)]
或者使用isinstance
(同样的速度,也测试str
的子类):
new_vals = [v for v in vals if isinstance(v,str) and pattern.search(v)]
https://stackoverflow.com/questions/56348564
复制相似问题