鱼C论坛

 找回密码
 立即注册
查看: 505|回复: 10

怎样准确提取出迟到早退的信息

[复制链接]
发表于 2024-4-27 19:07:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我们的考勤报表是从系统中用excel表格输出的,然后所有的迟到早退信息都是保存在批注中,我用openpyxl将所有的异常都读取出来了,但是怎样根据每一条信息,去提取出异常的类型和迟到早退的分钟数?
————————
14:02 迟到
迟到:迟到 3分钟
签到:14:02
签退:17:30


#这条信息要提取出“迟到”,“3”,“分钟”
————————
07:35 迟到
迟到:迟到 6分钟
签到:07:35
签退:11:30


#这条信息要提取出“迟到”,“6”,“分钟”
————————
07:53 迟到
迟到:迟到 24分钟
签到:07:53
签退:17:34


#这条信息要提取出“迟到”,“24”,“分钟”
————————
07:32 迟到
迟到:迟到 3分钟
早退:早退 4分钟
签到:07:32
签退:11:26


#这条信息要提取出“迟到”,“3”,“分钟”,以及“早退”,“4”,“分钟”

————————
13:56
早退:早退 7分钟
签到:13:56
签退:17:23


#这条信息要提取出“早退”,“7”,“分钟”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-27 19:07:49 | 显示全部楼层
你可以使用正则表达式来提取出异常的类型和迟到/早退的分钟数。下面是一个示例代码,可以帮助你实现这个功能:
import re

# 假设你已经从Excel中读取了所有的异常信息到一个列表comments中
comments = [
    "迟到:迟到 3分钟",
    "迟到:迟到 6分钟",
    "迟到:迟到 24分钟",
    "迟到:迟到 3分钟\n早退:早退 4分钟",
    "早退:早退 7分钟"
]

def extract_exception_info(comment):
    # 使用正则表达式提取异常类型和分钟数
    pattern = r"(迟到|早退)\D*(\d+)分钟"
    match = re.search(pattern, comment)
    
    if match:
        exception_type = match.group(1)  # 异常类型:迟到或早退
        minutes = match.group(2)  # 迟到/早退的分钟数
        return exception_type, minutes
    
    return None, None

# 遍历所有的异常信息,并提取出异常类型和分钟数
for comment in comments:
    exception_type, minutes = extract_exception_info(comment)
    print("异常类型:", exception_type)
    print("分钟数:", minutes)
    print("-------------------")

这段代码中,我们定义了一个`extract_exception_info`函数,它接收一个异常信息作为参数。然后使用正则表达式模式提取异常类型和分钟数。如果匹配成功,就返回异常类型和分钟数;否则返回`None`。

最后,我们遍历所有的异常信息,并调用`extract_exception_info`函数提取出异常类型和分钟数,并打印出来。

希望这个示例能帮到你!如果你有更多问题,请随时问我。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-27 19:16:10 | 显示全部楼层
可以用 textfsm 解决,参考一下这个:https://fishc.com.cn/thread-225359-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-27 19:36:13 | 显示全部楼层
FishC 发表于 2024-4-27 19:07
你可以使用正则表达式来提取出异常的类型和迟到/早退的分钟数。下面是一个示例代码,可以帮助你实现这个功 ...

不对,你的提取方法没办法准确提取我以下这条信息的内容,我下面这条信息是要它输出“迟到”,“3”,“分钟”,以及“早退”,“4”,“分钟”

07:32 迟到
迟到:迟到 3分钟
早退:早退 4分钟
签到:07:32
签退:11:26


#这条信息要提取出“迟到”,“3”,“分钟”,以及“早退”,“4”,“分钟”

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-27 19:36:28 | 显示全部楼层
laiyuanjie 发表于 2024-04-27 19:36
不对,你的提取方法没办法准确提取我以下这条信息的内 ...


非常抱歉,我对你的问题理解有误。请允许我重新改进代码以解决你的需求。
import re

comment = "07:32 迟到\n迟到:迟到 3分钟\n早退:早退 4分钟\n签到:07:32\n签退:11:26"

def extract_exception_info(comment):
    # 使用正则表达式提取异常类型和分钟数
    pattern = r"(迟到|早退)\D*(\d+)分钟"
    matches = re.findall(pattern, comment)
    
    exception_info = []
    
    for match in matches:
        exception_type = match[0]  # 异常类型:迟到或早退
        minutes = match[1]  # 迟到/早退的分钟数
        exception_info.append((exception_type, minutes))
    
    return exception_info

exception_info = extract_exception_info(comment)

for info in exception_info:
    print("异常类型:", info[0])
    print("分钟数:", info[1])
    print("-------------------")

在这个新的代码中,我们使用了`re.findall()`方法来找出所有匹配的结果,而不只是第一个。然后将结果存储在一个列表`exception_info`中。在最后的循环中,我们遍历这个列表并打印出每个异常的类型和分钟数。

现在,这段代码将能够准确提取出你所需的异常类型和分钟数。

非常感谢你的指正,希望这次的回答能够满足你的需求。如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-27 19:41:52 | 显示全部楼层
FishC 发表于 2024-4-27 19:36
非常抱歉,我对你的问题理解有误。请允许我重新改进代码以解决你的需求。

算了,,我直接拆成两个来实现,一个专门弄早退,一个专门弄迟到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-27 19:43:11 | 显示全部楼层
laiyuanjie 发表于 2024-04-27 19:41
算了,,我直接拆成两个来实现,一个专门弄早退,一个 ...


好的,拆分成两个来实现也是可行的。以下是分别提取迟到和早退信息的示例代码:

import re

def extract_late_info(comment):
    # 使用正则表达式提取迟到相关的信息
    pattern = r"迟到\D*(\d+)分钟"
    match = re.search(pattern, comment)
   
    if match:
        minutes = match.group(1)  # 迟到的分钟数
        return minutes
   
    return None

def extract_early_leave_info(comment):
    # 使用正则表达式提取早退相关的信息
    pattern = r"早退\D*(\d+)分钟"
    match = re.search(pattern, comment)
   
    if match:
        minutes = match.group(1)  # 早退的分钟数
        return minutes
   
    return None

comment = "07:32 迟到\n迟到:迟到 3分钟\n早退:早退 4分钟\n签到:07:32\n签退:11:26"

late_minutes = extract_late_info(comment)
early_leave_minutes = extract_early_leave_info(comment)

if late_minutes:
    print("迟到:", late_minutes, "分钟")

if early_leave_minutes:
    print("早退:", early_leave_minutes, "分钟")

在上面的代码中,我们定义了两个函数`extract_late_info`和`extract_early_leave_info`,分别用于提取迟到和早退相关的分钟数。我们使用了不同的正则表达式模式来匹配相应的信息。

最后,我们调用这两个函数来提取具体的分钟数,并打印出来。

希望这次的回答能够帮到你!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-27 21:22:42 | 显示全部楼层
FishC 发表于 2024-4-27 19:43
好的,拆分成两个来实现也是可行的。以下是分别提取迟到和早退信息的示例代码:

import re

事假:
2023-05-26 14:00 -- 2023-05-26 17:30 ( 共3.5小时 约0.438天)
签到:08:30
签退:漏刷

像这样,我要提取出这个3.5小时来,该怎么弄
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-27 21:23:01 | 显示全部楼层
laiyuanjie 发表于 2024-04-27 21:22
事假:
2023-05-26 14:00 -- 2023-05-26 17:30 ( 共3 ...


要提取出这个3.5小时的话,你可以使用正则表达式来匹配并提取数字和小数点。以下是一个示例代码:

import re

comment = "事假:\n2023-05-26 14:00 -- 2023-05-26 17:30 ( 共3.5小时 约0.438天)\n签到:08:30\n签退:漏刷"

def extract_hours(comment):
    # 使用正则表达式提取小时数
    pattern = r"共(\d+\.?\d*)小时"
    match = re.search(pattern, comment)

    if match:
        hours = match.group(1)  # 小时数
        return hours

    return None

hours = extract_hours(comment)

if hours:
    print("请假小时数:", hours)

在上面的代码中,我们定义了一个函数`extract_hours`,用于提取请假的小时数。我们使用了正则表达式模式来匹配共计小时数,并将结果返回。

然后,我们调用这个函数来提取小时数,并打印出来。

希望这段代码能帮到你!如果你还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-27 21:28:43 | 显示全部楼层
FishC 发表于 2024-4-27 21:23
要提取出这个3.5小时的话,你可以使用正则表达式来匹配并提取数字和小数点。以下是一个示例代码:

i ...

这个是我自己写的,有没有什么问题?

    def busy(self,comment):
        pattern = r"(共)\D*(\d+)小时"
        match = re.search(pattern, comment)
        if match:
            minutes = match.group(2)  # 迟到/早退的分钟数
            return minutes
        return None


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-27 21:29:05 | 显示全部楼层
laiyuanjie 发表于 2024-04-27 21:28
这个是我自己写的,有没有什么问题?

    def busy ...


你的代码基本上是正确的。不过,在正则表达式中,使用`(\d+)`来匹配数字部分时,你可能只会获取整数部分而忽略小数部分。如果你想要精确地匹配包含小数的小时数,可以将`(\d+)`更改为`(\d+(\.\d+)?)`。

另外,在你的代码中,你使用了`match.group(2)`来提取小时数。原本应该使用`match.group(1)`来获取第一个括号匹配的内容,而不是`match.group(2)`。你可能需要进行相应的修改。

最终的代码可以这样写:

    def busy(self, comment):
        pattern = r"(共)\D*(\d+(\.\d+)?)小时"
        match = re.search(pattern, comment)
        if match:
            hours = match.group(2)  # 小时数
            return hours
        return None

现在,你的函数`busy`将能够正确地提取出包含小数的小时数。希望这个解释能够帮到你!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 04:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表