リスト内包表記でregex re.compile Match()またはfindall()を使用する方法

2020-07-01 python python-3.x pandas list-comprehension re

パンダのextract()関数を使用せずに、リストの内包表記で正規表現を使用しようとしています。

より複雑なパターンマッチングを使用する必要がある場所でコードを変更する必要があるため、正規表現を使用したいと思います。ここの親切なユーザーはstrアクセサ関数を使用することを提案しましたが、現在のパターンが十分に単純であるため、主に機能しstr

今のところ、私はどちらか含まれているパンダの行返す必要がnan値下またはODFS_FILE_CREATE_DATETIMEある10弦番号は、IEではないが:現在の形式と一致しません2020012514 。この目的で、 strメソッドをバイパスして正規表現を使用しようとしました。しかし、これは何もしません。 nanのみを含む値、またはbool(regex.search())がtrueでない場所にのみ値を入れるように言ったにもかかわらず、それはタプルのリストにすべてを入れます:

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

Answers

reモジュールを使用する場合。 map使用する必要があり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]

:要件によっては、 search代わりにmatchを使用することもできると思います。

Related