匹配跨行及内嵌于文本的日期正则表达式编写问题
日期正则匹配优化方案
原正则存在的问题
你当前使用的正则仅支持单行、空格分隔的固定格式日期,没有覆盖换行空白、不同类型连字符、短日期(仅日月)的场景,也没有适配和其他字符拼接的提取需求。
1. 跨行日期匹配实现
核心修改逻辑
- 把正则里的固定空格替换为
\s+,可匹配任意空白字符(包括换行、空格、制表符) - 新增对长短两种连字符(
-/–)的适配 - 新增短日期(仅日月)的匹配兼容
- 匹配到结果后,把结果中的所有空白字符统一替换为单个空格即可得到格式化后的日期
适配正则
\d{1,2}\s+[ADFJMNOS][a-z]+(?:\s*[-–]\s*\d{1,2}\s+[ADFJMNOS][a-z]+\s*\d{4}|\s*\d{0,4})
匹配注意事项
使用re.findall时添加re.IGNORECASE参数,兼容大小写不一致的月份写法,拿到匹配结果后执行如下处理即可得到符合要求的输出:
# 对每个匹配结果做格式化 formatted_date = re.sub(r'\s+', ' ', raw_match).strip()
2. 拼接场景的日期提取实现
当前正则不需要额外加开头边界限制即可满足需求:正则会自动从第一个符合规则的数字(日期的日字段)开始匹配,自动忽略前面拼接的其他字符,直接提取出完整的日期内容。
如果要避免提取到其他非日期的数字片段,可以给正则添加前向校验,确保数字后面跟的是合法月份名即可,上面给出的适配正则已经覆盖了这个逻辑。
优化后完整代码
from selenium import webdriver from bs4 import BeautifulSoup import re url_list = ['https://alabamasymphony.org/event/bachmozart'] driver = webdriver.Chrome('/home/ubuntu/selenium_drivers/chromedriver') # 统一整合所有兼容场景的正则 date_pattern = re.compile( r'\d{1,2}\s+[ADFJMNOS][a-z]+(?:\s*[-–]\s*\d{1,2}\s+[ADFJMNOS][a-z]+\s*\d{4}|\s*\d{0,4})', re.IGNORECASE ) for URL in url_list: date = [] driver.get(URL) driver.implicitly_wait(2) data = driver.page_source # BeautifulSoup的text已经是纯文本,不需要额外正则清理标签 cleantext = BeautifulSoup(data, "lxml").text print(URL) all_dates = date_pattern.findall(cleantext) for raw_date in all_dates: # 替换所有空白为单个空格,去除首尾空白 formatted = re.sub(r'\s+', ' ', raw_date).strip() if formatted: date.append(formatted) for s in date: print(s)
内容的提问来源于stack exchange,提问作者Aniiya0978
相关产品推荐
相关产品推荐

