如何在列表理解中使用正则表达式 re.compile Match() 或 findall()
How to use regex re.compile Match() or findall() in list comprehension
我正在尝试在列表理解中使用正则表达式,而无需使用 pandas extract()
函数。
我想使用正则表达式,因为我的代码可能需要更改我需要使用更复杂模式匹配的地方。一位好心的用户建议我使用 str
访问器函数,但它再次起作用主要是因为当前模式足够简单。
截至目前,我需要 return pandas 包含 nan
或 ODFS_FILE_CREATE_DATETIME
下的值不是 10 个字符串数字的行,即:不匹配当前格式:2020012514
。为此,我试图绕过 str
方法并使用正则表达式。但是,这没有任何作用。它会将所有内容放入我的元组列表中,即使我告诉它只放置仅包含 nan
或 bool(regex.search())
不正确的值:
def process_csv_formatting(csv):
odfscsv_df = pd.read_csv(csv, header=None,names=['ODFS_LOG_FILENAME', 'ODFS_FILE_CREATE_DATETIME', 'LOT', 'TESTER', 'WAFER_SCRIBE'], dtype={'ODFS_FILE_CREATE_DATETIME': str})
odfscsv_df['CSV_FILENAME'] = csv.name
odfscdate_re = re.compile(r"\d{10}")
errortup = [(odfsname, "Bad_ODFS_FILE_CREATE_DATETIME= " + str(cdatetime), csv.name) for odfsname,cdatetime in zip(odfscsv_df['ODFS_LOG_FILENAME'], odfscsv_df['ODFS_FILE_CREATE_DATETIME']) if not odfscdate_re.search(str(cdatetime))]
emptypdf = pd.DataFrame(columns=['ODFS_LOG_FILENAME', 'ODFS_FILE_CREATE_DATETIME', 'LOT', 'TESTER', 'WAFER_SCRIBE'])
#print([tuple(x) for x in odfscsv_df[odfscsv_df.isna().any(1) | odfscdate_re.search(str(odfscsv_df['ODFS_FILE_CREATE_DATETIME'])) ].values])
m1 = odfscsv_df.isna().any(1)
m1 = odfscsv_df.isna().any(1)
s = odfscsv_df['ODFS_FILE_CREATE_DATETIME']
m2 = ~s.astype(str).str.isnumeric()
m2 = bool(odfscdate_re.search(str(s)))
m4 = not m2
print(m4)
m3 = s.astype(str).str.len().ne(10)
#print([tuple(x) for x in odfscsv_df[m1 | m2 | m3].values])
print([tuple(x) for x in odfscsv_df[m1 | ~bool(odfscdate_re.search(str(s)))].values])
if len(errortup) != 0:
#print(errortup) #put this in log file statement somehow
#print(errortup[0][2])
return emptypdf
else:
return odfscsv_df
如果你想使用re
模块。您需要将它与 map
一起使用。对于 10 位数字的字符串,请使用此模式 r"^\d{10}$"
import re
odfscdate_re = re.compile(r"^\d{10}$")
m1 = odfscsv_df.isna().any(1)
m2 = odfscsv_df['ODFS_FILE_CREATE_DATETIME'].map(lambda x:
odfscdate_re.search(str(x)) == None)
[tuple(x) for x in odfscsv_df[m1 | m2].values]
注意:看你的要求,我想你也可以用match
代替search
。
我正在尝试在列表理解中使用正则表达式,而无需使用 pandas extract()
函数。
我想使用正则表达式,因为我的代码可能需要更改我需要使用更复杂模式匹配的地方。一位好心的用户建议我使用 str
访问器函数,但它再次起作用主要是因为当前模式足够简单。
截至目前,我需要 return pandas 包含 nan
或 ODFS_FILE_CREATE_DATETIME
下的值不是 10 个字符串数字的行,即:不匹配当前格式:2020012514
。为此,我试图绕过 str
方法并使用正则表达式。但是,这没有任何作用。它会将所有内容放入我的元组列表中,即使我告诉它只放置仅包含 nan
或 bool(regex.search())
不正确的值:
def process_csv_formatting(csv):
odfscsv_df = pd.read_csv(csv, header=None,names=['ODFS_LOG_FILENAME', 'ODFS_FILE_CREATE_DATETIME', 'LOT', 'TESTER', 'WAFER_SCRIBE'], dtype={'ODFS_FILE_CREATE_DATETIME': str})
odfscsv_df['CSV_FILENAME'] = csv.name
odfscdate_re = re.compile(r"\d{10}")
errortup = [(odfsname, "Bad_ODFS_FILE_CREATE_DATETIME= " + str(cdatetime), csv.name) for odfsname,cdatetime in zip(odfscsv_df['ODFS_LOG_FILENAME'], odfscsv_df['ODFS_FILE_CREATE_DATETIME']) if not odfscdate_re.search(str(cdatetime))]
emptypdf = pd.DataFrame(columns=['ODFS_LOG_FILENAME', 'ODFS_FILE_CREATE_DATETIME', 'LOT', 'TESTER', 'WAFER_SCRIBE'])
#print([tuple(x) for x in odfscsv_df[odfscsv_df.isna().any(1) | odfscdate_re.search(str(odfscsv_df['ODFS_FILE_CREATE_DATETIME'])) ].values])
m1 = odfscsv_df.isna().any(1)
m1 = odfscsv_df.isna().any(1)
s = odfscsv_df['ODFS_FILE_CREATE_DATETIME']
m2 = ~s.astype(str).str.isnumeric()
m2 = bool(odfscdate_re.search(str(s)))
m4 = not m2
print(m4)
m3 = s.astype(str).str.len().ne(10)
#print([tuple(x) for x in odfscsv_df[m1 | m2 | m3].values])
print([tuple(x) for x in odfscsv_df[m1 | ~bool(odfscdate_re.search(str(s)))].values])
if len(errortup) != 0:
#print(errortup) #put this in log file statement somehow
#print(errortup[0][2])
return emptypdf
else:
return odfscsv_df
如果你想使用re
模块。您需要将它与 map
一起使用。对于 10 位数字的字符串,请使用此模式 r"^\d{10}$"
import re
odfscdate_re = re.compile(r"^\d{10}$")
m1 = odfscsv_df.isna().any(1)
m2 = odfscsv_df['ODFS_FILE_CREATE_DATETIME'].map(lambda x:
odfscdate_re.search(str(x)) == None)
[tuple(x) for x in odfscsv_df[m1 | m2].values]
注意:看你的要求,我想你也可以用match
代替search
。