Python:使用正则表达式检查列表,并填充空格
我试图找到方法来做到这一点,并在这里在线搜索,但找不到例子来帮助我解决这个问题 我从一个大的csv中逐行读取,并将每一行更改为一个列表。问题是数据源不是很干净。它有时有空字符串或坏数据,当这种情况发生时,我需要填写默认值。例如:Python:使用正则表达式检查列表,并填充空格,python,regex,list,missing-data,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有一
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之间正好有一位数字
第三个条目:也正好是一个数字。
第四项:标准格式的日期,允许任何四位整数表示年份
第五项:浮动
如果条目为空或与正则表达式不匹配,则应使用以下默认值填充/替换该条目:
default_fill = ['empty','0','0','2000-01-01','0']
我不知道最好的办法是什么。我想我可以写一个复杂的循环,但做这样的事情对我来说并不是很“pythonic”
有更好的主意吗?像这样的怎么样
map(lambda(x,y,z): re.search(y,x) and x or z, zip(list_ex1, reg_ex_check, default_fill))
像这样的怎么样
map(lambda(x,y,z): re.search(y,x) and x or z, zip(list_ex1, reg_ex_check, default_fill))
在列表中使用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']
您实际上不需要显式地检查空白字符串,因为各种regex复数形式的regex在空白字符串上都会失败
其他注意事项:您可能仍然希望为每个正则表达式的字符串末尾添加一个锚点。使用re.match可以确保它从一开始就尝试匹配,但仍然不能保证匹配后没有非法内容。考虑:
['pear and a pear tree', '0blah', '4 4 4', '2000-01-0000', '192.168.0.bananas']
如果不在每个正则表达式的末尾添加$anchor:-在列表中使用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']
您实际上不需要显式地检查空白字符串,因为各种regex复数形式的regex在空白字符串上都会失败
其他注意事项:您可能仍然希望为每个正则表达式的字符串末尾添加一个锚点。使用re.match可以确保它从一开始就尝试匹配,但仍然不能保证匹配后没有非法内容。考虑:
['pear and a pear tree', '0blah', '4 4 4', '2000-01-0000', '192.168.0.bananas']
上面的整个列表是可以接受的,如果你不在每个正则表达式的结尾加上一个$锚:-< /p>谢谢你对空白字符串的澄清,我早就想到了。加上正则表达式。@nfmclure没问题。请参阅我的编辑,您应该考虑添加一个额外的字符串锚结束到您的所有ReGEX。您可能需要编译您的ReGEXP列表的效率!因为它在多个循环中使用了很多次。@ CasARSOL的RE模块缓存了最后100个编译正则表达式,所以这不是真的必要。谢谢你对空白字符串的澄清,我应该想到这一点。加上正则表达式。@nfmclure没问题。请参阅我的编辑,您应该考虑添加一个额外的字符串锚结束到您的所有ReGEX。您可能需要编译您的ReGEXP列表的效率!因为它在多个循环中被多次使用,所以re模块缓存最后100个编译的正则表达式,所以这并不是必需的。