簡體   English   中英

如何在列表理解中使用正則表達式 re.compile Match() 或 findall()

[英]How to use regex re.compile Match() or findall() in list comprehension

我正在嘗試在列表理解中使用正則表達式,而無需使用 pandas extract()函數。

我想使用正則表達式,因為我的代碼可能需要更改我需要使用更復雜模式匹配的位置。 這里的一位好心用戶建議我使用str訪問器函數,但它再次主要起作用,因為當前模式足夠簡單。

截至目前,我需要返回 pandas 行,這些行要么包含nan ,要么ODFS_FILE_CREATE_DATETIME下的值不是 10 個字符串數字,即:與當前格式不匹配: 2020012514 為此,我試圖繞過str方法並使用正則表達式。 然而,這並沒有做任何事情。 即使我告訴它只放置僅包含nanbool(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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM