如何从OCR识别的排班字符串中提取日期与工作时段?
从OCR排班字符串提取日期与工作时段
原始OCR识别的排班字符串:
MySchedule UK & Ireland*************** (Custo_MHS00801682LIPHOOK SERVICESESSMy ScheduleEnglish (**************** ScheduleOf 22. Jul 20243My Work2583042ScheduleTrade BoardTimecardRequestsAvallable ShiftsHome Store Events**************; ************* TimeBreakLocationNotes AlertsMon, 22.JulDay OffRecentlyTue, 23 Jul15.00-21.008R -17.45 _18.3000801682LIPHOOK SERWCES NORTHStore Open AI DayOpenedWed, 24 Jul12.00 -21.008Rt6:15-17.0000801682 _LIPHOOK SERWCES NORTHStore Open AIl DaySummer HolidaysThu, 25 Jul17.00-22.00SR -19.15 _19.4500801682LIPHOOK SERWCES NORTHStore Open AI DaySummer HolidaysFri, 26 Jul17.00- 23.00SR -19.45 _20.3000801682LIPHOOK SERWCES NORTHStore Open AI DaySummer HolidaysSat; 27 Jul12.00 -21.008Rt6:15-17.0000801682 _LIPHOOK SERWCES NORTHStore Open AIl DaySummer HolidaysSun, 28.JulNct ScheduledWeek
针对这类OCR产生的混乱文本,最直接的解决方案是使用正则表达式精准匹配日期和对应的工作时段:
正则匹配规则
使用以下正则模式可以匹配目标内容:
(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s*\d{1,2}\.\s*Jul\s*(\d{2}\.\d{2}\s*-\s*\d{2}\.\d{2})?
规则说明:
(Mon|Tue|Wed|Thu|Fri|Sat|Sun):匹配星期缩写,?\s*\d{1,2}\.\s*Jul:匹配日期格式(兼容带逗号、空格分隔的22.Jul或23 Jul形式)(\d{2}\.\d{2}\s*-\s*\d{2}\.\d{2})?:可选匹配工作时段(兼容带空格的15.00-21.00或12.00 -21.00形式)
Python代码实现
import re ocr_text = """MySchedule UK & Ireland*************** (Custo_MHS00801682LIPHOOK SERVICESESSMy ScheduleEnglish (**************** ScheduleOf 22. Jul 20243My Work2583042ScheduleTrade BoardTimecardRequestsAvallable ShiftsHome Store Events**************; ************* TimeBreakLocationNotes AlertsMon, 22.JulDay OffRecentlyTue, 23 Jul15.00-21.008R -17.45 _18.3000801682LIPHOOK SERWCES NORTHStore Open AI DayOpenedWed, 24 Jul12.00 -21.008Rt6:15-17.0000801682 _LIPHOOK SERWCES NORTHStore Open AIl DaySummer HolidaysThu, 25 Jul17.00-22.00SR -19.15 _19.4500801682LIPHOOK SERWCES NORTHStore Open AI DaySummer HolidaysFri, 26 Jul17.00- 23.00SR -19.45 _20.3000801682LIPHOOK SERWCES NORTHStore Open AI DaySummer HolidaysSat; 27 Jul12.00 -21.008Rt6:15-17.0000801682 _LIPHOOK SERWCES NORTHStore Open AIl DaySummer HolidaysSun, 28.JulNct ScheduledWeek""" pattern = r'(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s*\d{1,2}\.\s*Jul\s*(\d{2}\.\d{2}\s*-\s*\d{2}\.\d{2})?' matches = re.finditer(pattern, ocr_text) # 整理并输出结果 schedule = [] for match in matches: day_part = match.group(0).replace(';', ',').strip() # 修正Sat后的分号格式 # 判断是否为休息/无排班 follow_text = ocr_text[match.end():match.end()+20] if 'Day Off' in follow_text or 'Not Scheduled' in follow_text.replace('Nct', 'Not'): schedule.append(f"{day_part}: 休息/无排班") else: schedule.append(day_part) for item in schedule: print(item)
提取结果
运行代码后将得到清晰的排班信息:
- Mon, 22.Jul: 休息/无排班
- Tue, 23 Jul 15.00-21.00
- Wed, 24 Jul 12.00 -21.00
- Thu, 25 Jul 17.00-22.00
- Fri, 26 Jul 17.00- 23.00
- Sat, 27 Jul 12.00 -21.00
- Sun, 28.Jul: 休息/无排班
内容的提问来源于stack exchange,提问作者Sky Holdsworth-Kirda
相关产品推荐
相关产品推荐

