【问题标题】:Python: Checking a list with regex, filling in blanksPython:使用正则表达式检查列表,填写空白
【发布时间】:2014-02-23 13:20:07
【问题描述】:

我试图找到解决方法并在此处在线搜索,但找不到帮助我解决此问题的示例。

我正在从一个大的 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 项:也是一位数。
  • 第 4 项:标准格式的日期(允许任何四位整数表示年份)
  • 第 5 个条目:浮点数

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

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

我不确定最好的方法是什么。我想我可以写一个复杂的循环,但我觉得做这样的事情不是很“pythonic”。

有更好的想法吗?

【问题讨论】:

    标签: python regex list missing-data


    【解决方案1】:

    这样的事情呢?

    map(lambda(x,y,z): re.search(y,x) and x or z, zip(list_ex1, reg_ex_check, default_fill)) 
    

    【讨论】:

      【解决方案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']
      

      您实际上并不需要显式检查空白字符串,因为您的各种正则表达式(正则表达式的复数)都会在空白字符串上失败。

      其他注意事项:您可能仍希望在每个正则表达式的字符串末尾添加一个锚点。使用re.match 可确保它从一开始就尝试匹配,但仍不能保证在您的匹配之后 没有非法内容。考虑:

      ['pear and a pear tree', '0blah', '4 4 4', '2000-01-0000', '192.168.0.bananas']
      

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

      【讨论】:

      • 感谢您澄清空白字符串,我应该想到这一点。加上正则表达式。
      • @nfmcclure 没问题。请参阅我的编辑,您可能应该考虑为所有正则表达式添加一个额外的字符串结尾锚。
      • 您可能想要编译您的正则表达式列表以提高效率!因为它在多个循环中被多次使用。
      • @caesarsol re 模块缓存了最后 100 个编译的正则表达式,所以这并不是必需的。
      猜你喜欢
      • 2013-07-26
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 2011-03-02
      • 1970-01-01
      • 2013-05-01
      相关资源
      最近更新 更多