使用正则表达式爬取文本时如何正确提取含v.标识的目标条目
正则匹配问题修复方案
原规则缺陷
你之前写的(?s)v\..*?(?:\d\d\d\d\))存在三个核心问题:
- 开启了单行匹配模式,符号
.会匹配换行符,多行文本下容易出现跨条目串匹配 - 匹配起点固定从
v.位置开始,无法捕获v.前方的案件主体内容 - 没有设计前缀过滤逻辑,不能自动剔除条目开头的引导词、标点、冗余空格等无关内容
可用正则规则
关闭单行模式、开启多行模式,使用以下正则,提取第一个捕获组的内容即可得到目标结果:
(?:^|[\n;])\s*(?:[\w.]+\.|See)?\s*(.*?v\..*?\(\d{4}\))
规则逻辑说明:
- 先匹配条目边界:行首、换行符、分句分号
- 跳过边界后可能存在的冗余空格
- 匹配并跳过常见的引用引导内容,比如
See、e.g.这类引导词 - 捕获组从有效案件名起始位置开始,向后匹配到
v.,再匹配到四位年份+右括号的位置,完整覆盖目标内容
代码实现示例(Python)
import re sample_text = """See Holiday in v. Marriot (2002) e.g. FB v. Google (2012) ; Yahoo! v. Microsoft (2000)""" # 编译正则,开启多行模式 regex = re.compile(r'(?:^|[\n;])\s*(?:[\w.]+\.|See)?\s*(.*?v\..*?\(\d{4}\))', re.M) # 提取所有匹配结果,去除首尾多余空格 target_content = [item.group(1).strip() for item in regex.finditer(sample_text)] # 打印输出结果 for line in target_content: print(line)
运行后输出结果完全符合需求:
Holiday in v. Marriot (2002) FB v. Google (2012) Yahoo! v. Microsoft (2000)
如果后续遇到其他类型的引导前缀,只需要在(?:[\w.]+\.|See)?这部分补充对应的前缀匹配规则即可。
内容的提问来源于stack exchange,提问作者HoyaMiner
相关产品推荐
相关产品推荐

