多模式的正则表达式匹配

2024-10-04 01:30:14 发布

您现在位置:Python中文网/ 问答频道 /正文

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

    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月

期望输出:需要在简历中使用上述日期范围计算总经验


Tags: 代码文本reline模式经验regexexperience
1条回答
网友
1楼 · 发布于 2024-10-04 01:30:14

尽管在写这个答案的时候,问题中的代码是不可执行的,并且缺少一些部分,但我还是尝试了一些方法来帮助理解这个问题

我认为你可以通过仔细创建捕获组来实现你想要的。根据您提供的简单输入Sample Input:12/2020 - 04/2021,我提出了这个解决方案

在这个例子中,我创建了2个正则表达式。在第3组之前,它们有相似的模式regex2有一个稍微不同的结尾来捕获单词,而不是数字,这导致它没有捕获组4和5

group1:捕获开始月份

group2:捕获开始年份

group3:用regex1或用regex2捕获单词Present捕获完整的结束日期

gruop4:如果结束日期不等于单词Present,则捕获结束月份

group5:如果结束日期不等于单词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

相关问题 更多 >