laiyuanjie 发表于 2024-4-27 19:07:30

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

我们的考勤报表是从系统中用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”,“分钟”

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

isdkz 发表于 2024-4-27 19:16:10

可以用 textfsm 解决,参考一下这个:https://fishc.com.cn/thread-225359-1-1.html

laiyuanjie 发表于 2024-4-27 19:36:13

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

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

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


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

FishC 发表于 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# 异常类型:迟到或早退
      minutes = match# 迟到/早退的分钟数
      exception_info.append((exception_type, minutes))
   
    return exception_info

exception_info = extract_exception_info(comment)

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

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

laiyuanjie 发表于 2024-4-27 19:41:52

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




算了,,我直接拆成两个来实现,一个专门弄早退,一个专门弄迟到

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

laiyuanjie 发表于 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小时来,该怎么弄

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

laiyuanjie 发表于 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


FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 怎样准确提取出迟到早退的信息