【发布时间】:2019-05-28 19:01:34
【问题描述】:
在测试数据类型时,在 for 循环中使用正则表达式的最佳方法是什么?
对于上下文,我正在循环使用具有多种数据类型的大型不干净数据集,并且需要找到字符串的扩展(如果存在)。对我的代码进行小的更改,例如将值转换为字符串会花费我几分钟的时间。
我通读了这个问题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
【问题讨论】:
-
啊:
if ((type(v)==str) and (pattern.search(v) is not None)):。&不会短路 -
@Jean-FrançoisFabre 给出了答案。
-
好吧,我会投票赞成错字。 OP不清楚结果。当已经有“快速”尝试时,第三次尝试的意义何在?我们应该保留非字符串值,还是将它们过滤掉?
-
不要在比较中使用
type(v)。请改用isinstance(v, str)。 -
@chepner:当您确定对象是确切类型时,测试类型会更快
标签: python regex performance