正则表达式问题:提取文档中最后一个“——”后的所有行并统计行数
正则表达式问题:提取文档中最后一个“——”后的所有行并统计行数
你已经找对了方向——能匹配到最后一个“——”就成功了一半!其实只需要在这个基础上延伸一下,就能捕获到后面的所有内容,进而统计行数。我给你两种实用的方案,适配不同的正则引擎场景:
方案1:使用\K直接获取目标内容(支持PCRE、PHP、Python 3.10+等)
这个写法和你之前尝试的(?s:.*\s)\K——思路一致,只是把后续内容也纳入匹配:
(?s).*——\s*\K.*
正则各部分解释:
(?s):开启单行模式,让.可以匹配换行符,这样.*能跨多行找到最后一个“——”(贪婪模式会自动优先匹配到最末尾的分隔符).*——:贪婪匹配从文档开头到最后一个“——”的所有内容\s*:匹配“——”后面的任意空白(包括换行、空格),避免开头空行干扰结果\K:重置匹配起点,把前面匹配到的内容“丢弃”,只保留后面的部分.*:匹配“——”之后的所有剩余内容
如果只想精准匹配1 nuit格式的行(排除可能的其他内容),可以把最后一个.*换成(?:1 nuit\s*)+:
(?s).*——\s*\K(?:1 nuit\s*)+
方案2:用捕获组兼容更多引擎(比如Python旧版本、JavaScript)
如果你的正则引擎不支持\K,可以用捕获组来提取目标内容:
(?s).*——\s*(.*)
这里的捕获组(.*)会直接拿到“——”之后的所有内容,后续从捕获组中提取即可。
统计行数的方法
拿到目标内容后,统计行数很简单:
- 方法1:把内容按换行符分割,过滤掉空行后计数
- 方法2:直接用正则匹配每一行的标识(比如
1),统计匹配次数
举个Python的示例代码:
import re # 你的原始文本 text = """TITLE —— 1 nuit 1 nuit 1 nuit 1 nuit 1 nuit total : 5 nuits —— 1 nuit 1 nuit 1 nuit total : 3 nuits —— 1 nuit 1 nuit 1 nuit 1 nuit 1 nuit 1 nuit """ # 用方案1匹配内容 pattern = r'(?s).*——\s*\K.*' match_result = re.search(pattern, text) if match_result: target_content = match_result.group() # 过滤空行后统计行数 valid_lines = [line for line in target_content.split('\n') if line.strip()] print(f"统计到的行数:{len(valid_lines)}") print("\n捕获到的内容:") print(target_content)
运行后会输出行数6,以及你预期的那6行内容。
如果只想统计1 nuit的数量,也可以直接用re.findall:
count = len(re.findall(r'(?s).*——\s*\K1', text)) print(f"统计到的行数:{count}")
结果同样是6。
备注:内容来源于stack exchange,提问作者Aurore
相关产品推荐
相关产品推荐

