Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:使用正则表达式检查列表,并填充空格_Python_Regex_List_Missing Data - Fatal编程技术网

Python:使用正则表达式检查列表,并填充空格

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有一

我试图找到方法来做到这一点,并在这里在线搜索,但找不到例子来帮助我解决这个问题

我从一个大的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之间正好有一位数字 第三个条目:也正好是一个数字。 第四项:标准格式的日期,允许任何四位整数表示年份 第五项:浮动 如果条目为空或与正则表达式不匹配,则应使用以下默认值填充/替换该条目:

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个编译的正则表达式,所以这并不是必需的。