【问题标题】:How to use regex re.compile Match() or findall() in list comprehension如何在列表理解中使用正则表达式 re.compile Match() 或 findall()
【发布时间】:2020-07-01 00:57:19
【问题描述】:

我正在尝试在列表理解中使用正则表达式,而无需使用 pandas extract() 函数。

我想使用正则表达式,因为我的代码可能需要更改我需要使用更复杂模式匹配的地方。这里的一位好心用户建议我使用 str 访问器函数,但它主要是因为当前模式足够简单。

到目前为止,我需要返回包含 nanODFS_FILE_CREATE_DATETIME 下的值不是 10 个字符串数字的 pandas 行,即:与当前格式不匹配: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

【问题讨论】:

    标签: python python-3.x pandas list-comprehension python-re


    【解决方案1】:

    如果你想使用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

    【讨论】:

    • 哇,谢谢,没有你安迪我该怎么办?非常感谢。一件事,正则表达式没有称为匹配的方法。我只看到 search、findall、split 和 sub
    • @edo101:你说得真好 :)。在re.match,python re 模块有re.matchre.match(pattern, string, flags=0)docs.python.org/3/library/re.html。在该页面内搜索您将看到re.match
    • 哈哈,我现在明白了。也许我不应该将 W3Schools 作为学习 Python 的福音。他们没有提到比赛。好吧,现在我需要看看 .map() 做了什么,因为我以前从未使用过它。为什么我原来的方法不起作用:[tuple(x) for x in odfscsv_df[m1 | ~bool(odfscdate_re.search(str(s)))].values]
    • re.search 检查单个字符串。在您的代码中,您传递了整个系列的s,因此它不起作用。 Pandas mapodfscsv_df['ODFS_FILE_CREATE_DATETIME'] 的每个值传递给 lambda 函数。所以 lambda 中的xodfscsv_df['ODFS_FILE_CREATE_DATETIME'] 的每个字符串。因此,re.search 可以正常工作。在Not Found 上,re.search 返回None,因此我们检查re.searchNone 的返回以获取正确的布尔掩码
    • 哦,这是熊猫方法。啊不知道。正在挠头谷歌搜索。再次感谢安迪。如果我亲自遇到你,我会请你吃一顿丰盛的大餐
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多