Python:使用正则表达式检查列表,填写空白

时间:2014-01-30 23:56:53

标签: python regex list missing-data

我试图找到这样做的方法,并在网上搜索,但找不到帮助我解决这个问题的例子。

我正在从大型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.]+']

那是:

  • 第一个条目:一个字符串,没有数字
  • 第二个条目:0到9之间的一个数字
  • 第3项:也正好是一位数。
  • 第四个条目:标准格式的日期(允许任何四位数的年份)
  • 第五个条目:Float

如果条目为空或与正则表达式不匹配,则应填写/替换为以下默认值:

default_fill = ['empty','0','0','2000-01-01','0']

我不确定如何解决这个问题的最佳方式。我想我可以编写一个复杂的循环,但对我来说做这些事情并不觉得非常“pythonic”。

有更好的想法吗?

2 个答案:

答案 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']

如果您不在每个正则表达式的末尾添加$锚点,则上面的整个列表是“可接受的”: - )