多模式的正则表达式匹配

8gsdolmq  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(478)

需要关于正则表达式的帮助来匹配多个模式,但代码似乎不起作用。我想在简历中提取与正则表达式模式匹配的文本以获得“经验”

regex1 = '(?P<fmonth>\w+.\d+)\s*(\D|to)\s*(?P<smonth>\w+.\d+|present)'
    regex2 = '(?P<day>\d{1,2})\s*(?P<tmonth>\w+.\d+)\s*(\D|-)\s*(?P<bmonth>\w+.\d+|present)'
    regex3 = '(0[1-9]|1[0-2])/?([0-9]{4})\s*(\D|-)\s*(0[1-9]|1[0-2])/?([0-9]{4})'
    regex4= '(\d{4}-\d{2})\s*(\D|-)\s*(\d{4}-\d{2}|present)'
    regexList = [regex1,regex2,regex3,regex4]
    for regex in regexList:
        # experience= re.findall(regex,line)
        experience = re.match(regex,line)
        exp_.append(experience)
        print(exp_)

但是,即使简历中存在日期格式匹配项,匹配项也始终返回“无”
样本输入:2020年12月-2021年4月
期望输出:需要在简历中使用上述日期范围计算总经验

qij5mzcb

qij5mzcb1#

尽管在写这个答案的时候,问题中的代码是不可执行的,并且缺少一些部分,但我还是尝试了一些方法来帮助理解这个问题。
我认为你可以通过仔细创建捕获组来实现你想要的。基于您提供的简单输入 Sample Input:12/2020 - 04/2021 ,我想出了这个解决方案。
在这个例子中,我创建了2个正则表达式。在第3组之前,它们有相似的模式。 regex2 有一个稍微不同的结尾来捕获一个单词,而不是数字,导致它没有捕获组4和5。 group1 :开始月份 group2 :开始年份 group3 :捕获完整的结束日期 regex1 或字 Present 具有
regex2 gruop4 :如果结束日期不等于word,则捕获结束月份
Present group5 :如果结束日期不等于word,则捕获结束年份 Present 注意,我没有处理各种输入可能出现的所有异常。

import re
from datetime import datetime

from dateutil import relativedelta

line = """
12/2020 - 04/2021
05/2021 - Present
"""

regex1 = '(\d{2})\/(\d{4})\s-\s((\d{2})\/(\d{4}))'
regex2 = '(\d{2})\/(\d{4})\s-\s(Present)'
regexList = [regex1, regex2]

def diff_month(d1, d2):
    return (d1.year - d2.year) * 12 + d1.month - d2.month

exp_ = 0
for regex in regexList:
    for date_match in re.finditer(regex, line):
        start_month = int(date_match.group(1))
        start_year = int(date_match.group(2))
        end_month = None
        end_year = None
        if date_match.group(3) == "Present":
            today = datetime.today()
            end_month = today.month.real
            end_year = today.year.real
        else:
            end_month = int(date_match.group(4)) + 1  # +1 to get full month
            end_year = int(date_match.group(5))
        delta = relativedelta.relativedelta(datetime(end_year, end_month, 1), datetime(start_year, start_month, 1))
        delta_months = delta.months + (12 * delta.years)
        exp_ += delta_months

print("Total Experience = " + str(exp_ // 12) + " years " + str(exp_ % 12) + " months")

结果

Total Experience = 0 years 7 months

相关问题