怎样准确提取出迟到早退的信息
我们的考勤报表是从系统中用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”,“分钟” 你可以使用正则表达式来提取出异常的类型和迟到/早退的分钟数。下面是一个示例代码,可以帮助你实现这个功能:
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 小助理,如未能正确解答您的问题,请继续追问。 可以用 textfsm 解决,参考一下这个:https://fishc.com.cn/thread-225359-1-1.html FishC 发表于 2024-4-27 19:07
你可以使用正则表达式来提取出异常的类型和迟到/早退的分钟数。下面是一个示例代码,可以帮助你实现这个功 ...
不对,你的提取方法没办法准确提取我以下这条信息的内容,我下面这条信息是要它输出“迟到”,“3”,“分钟”,以及“早退”,“4”,“分钟”
07:32 迟到
迟到:迟到 3分钟
早退:早退 4分钟
签到:07:32
签退:11:26
#这条信息要提取出“迟到”,“3”,“分钟”,以及“早退”,“4”,“分钟”
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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-4-27 19:36
非常抱歉,我对你的问题理解有误。请允许我重新改进代码以解决你的需求。
算了,,我直接拆成两个来实现,一个专门弄早退,一个专门弄迟到 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 小助理,如未能正确解答您的问题,请继续追问。 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小时来,该怎么弄
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 小助理,如未能正确解答您的问题,请继续追问。 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
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]