Python 如何将多个正则表达式与pandas中的命名组一起使用

Python 如何将多个正则表达式与pandas中的命名组一起使用,python,regex,pandas,Python,Regex,Pandas,我尝试使用不同的正则表达式和命名组来匹配日期,这样每个正则表达式都会将相同的组名返回到数据帧中。其思想是搜索第一个正则表达式,如果没有匹配项,则使用第二个正则表达式并将结果发送到相同的组/列,以此类推。所有正则表达式最多有3个组(月、日、年)。有时顺序不同,有时只有and,等等。不要担心正则表达式的正确性,我只想解决组的问题。 示例正则表达式: regex1 = '(?P<extracted>(?P<month>\d{1,2})[/-](?P<day>\d{1

我尝试使用不同的正则表达式和命名组来匹配日期,这样每个正则表达式都会将相同的组名返回到数据帧中。其思想是搜索第一个正则表达式,如果没有匹配项,则使用第二个正则表达式并将结果发送到相同的组/列,以此类推。所有正则表达式最多有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)
regex1='(?P(?P\d{1,2})[/-](?P\d{1,2})[/-](?P\d{2,4}))'
regex2=“(?P(?PJan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec)s(?P[1 | 2]\_d{3})”
regex3='(?P(?P[1 | 2]\d{3}))'
full_regex=f'({regex1}{regex2}{regex3})
df_captured=df['original'].str.extract(完整正则表达式)
问题是命名组不能重复。有没有一种解决方案不使用嵌套的if statemnts或更丑陋的东西?

您可以使用,因为它允许使用任意数量的同名捕获组。但是它需要使用
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"]

谢谢你的回答。我唯一的怀疑是关于。我的理解是,这两个符号表示不捕获该组(),但它在这里的用途是什么?我尝试了使用和不使用?:并且在输出中没有看到任何差异。Regards@ELECE由于您只需要捕获组中的值,因此在生成的匹配数据对象中不需要额外的组。它节省了一点点计算资源,并使匹配数据对象“更轻”。
>>> df_captured
    Day Month  Year
0  None   Oct  2019
1    04    12  2002
2  None  None  2021