我试图找到这样做的方法,并在网上搜索,但找不到帮助我解决这个问题的例子。
我正在从大型csv读取行并将每行更改为列表。问题是数据源不是很干净。它有时会出现空字符串或坏数据,当发生这种情况时我需要填写默认值。例如:
list_ex1 = ['apple','9','','2012-03-05','455.6']
list_ex2 = ['pear','0','45','wrong_entry','565.11']
这里,list_ex1有一个空白的第三个条目,list_ex2有一个错误的数据,其中的日期应该是。为了清楚起见,我可以创建一个限制五个条目中每个条目的正则表达式:
reg_ex_check = ['[A-Za-z]+','[0-9]','[0-9]','[0-9]{4}-[0-1][0-9]-[0-3][0-9]','[0-9.]+']
那是:
如果条目为空或与正则表达式不匹配,则应填写/替换为以下默认值:
default_fill = ['empty','0','0','2000-01-01','0']
我不确定如何解决这个问题的最佳方式。我想我可以编写一个复杂的循环,但对我来说做这些事情并不觉得非常“pythonic”。
有更好的想法吗?
答案 0 :(得分:2)
这样的事情怎么样?
map(lambda(x,y,z): re.search(y,x) and x or z, zip(list_ex1, reg_ex_check, default_fill))
答案 1 :(得分:2)
在列表推导中使用zip
和条件表达式:
[x if re.match(r,x) else d for x,r,d in zip(list_ex2,reg_ex_check,default_fill)]
Out[14]: ['pear', '0', '45', '2000-01-01', '565.11']
你真的不需要显式检查空字符串,因为你的各种regexen(复数正则表达式)都会在空字符串上失败。
其他注意:您可能仍希望为每个正则表达式添加字符串末尾的锚点。使用re.match
确保它尝试从头开始匹配,但仍然无法保证在匹配后没有非法的东西。考虑:
['pear and a pear tree', '0blah', '4 4 4', '2000-01-0000', '192.168.0.bananas']
如果您不在每个正则表达式的末尾添加$
锚点,则上面的整个列表是“可接受的”: - )