[英]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.