簡體   English   中英

如何在 pandas 中對命名組使用多個正則表達式

[英]How to use multiple regular expressions with named groups in pandas

我正在嘗試使用命名組使用不同的正則表達式來匹配日期,以便每個正則表達式將相同的組名返回到 DataFrame 中。 這個想法是搜索第一個正則表達式,如果沒有匹配,使用第二個正則表達式並將結果發送到相同的組/列,依此類推。 所有正則表達式最多有 3 個組(月、日、年)。 有時順序不同,有時只有and,等等。不要擔心正則表達式的正確性,我只是想弄清楚組的問題。 正則表達式示例:

regex1 = '(?P<extracted>(?P<month>\d{1,2})[/-](?P<day>\d{1,2})[/-](?P<year>\d{2,4}))'
regex2 = '(?P<extracted>(?P<month>Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(?P<year>[1|2]\d{3}))'
regex3 = '(?P<extracted>(?P<year>[1|2]\d{3}))'
full_regex = f'({regex1}|{regex2}|{regex3})'
df_captured = df['original'].str.extract(full_regex)

問題是命名組不能重復。 是否有不使用嵌套 if statatemnts 或更丑的東西的解決方案?

您可以使用PyPi 正則表達式,因為它允許使用任意數量的同名捕獲組。 但它需要使用apply ,因為 Pandas 使用的默認正則表達式庫是re

示例解決方案:

import regex

df = pd.DataFrame({'original': ['Oct 2019', 'Some 12-04-2002', '2021']})

regex1 = '(?P<extracted>(?P<month>\d{1,2})[/-](?P<day>\d{1,2})[/-](?P<year>\d{2,4}))'
regex2 = '(?P<extracted>(?P<month>Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(?P<year>[1|2]\d{3}))'
regex3 = '(?P<extracted>(?P<year>[1|2]\d{3}))'
full_regex = f'(?:{regex1}|{regex2}|{regex3})'

def extract_regex(text, pattern):
    m = regex.search(pattern, text)
    if not m:
        return pd.Series([np.NaN, np.NaN, np.NaN])
    else:
        return pd.Series([m.group("day"),m.group("month"),m.group("year")])

df_captured = df['original'].apply(lambda x: extract_regex(x, full_regex))
df_captured.columns = ['Day', "Month", "Year"]

Output:

>>> df_captured
    Day Month  Year
0  None   Oct  2019
1    04    12  2002
2  None  None  2021

暫無
暫無

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

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