如何编写Python正则表达式实现含<br>的结构化文本正确分组提取
正则表达式合并多行字段问题解决
问题场景
现有一段包含多字段的文本,常规字段以[字段名]:[内容]<br>格式存在,但Additional Information字段的内容跨了多个<br>片段。当前正则会将这些片段拆分成独立项,需要把该字段下的所有内容合并为单个项,直到下一个带冒号的字段出现。
现有代码
import re txt = "Person:Tester Test<br>Count:1<br>Testing:test<br>Additional Information:test1<br>test2<br>test3<br>Temp:123<br>" x = re.findall("(.*?<br>)", txt) for i in x: print("- " + i)
当前输出
- Person:Tester Test<br> - Count:1<br> - Testing:test<br> - Additional Information:test1<br> - test2<br> - test3<br> - Temp:123<br>
期望输出
- Person:Tester Test<br> - Count:1<br> - Testing:test<br> - Additional Information:test1<br>test2<br>test3<br> - Temp:123<br>
解决方案
利用**正向预查(lookahead)**精准匹配到下一个字段开头前的所有内容,对应的正则表达式和修改后代码如下:
修改后的代码
import re txt = "Person:Tester Test<br>Count:1<br>Testing:test<br>Additional Information:test1<br>test2<br>test3<br>Temp:123<br>" # 匹配字段名+内容,直到下一个字段名或文本结束 x = re.findall(r"(.+?:.*?(?=(?:\w+:)|\Z))", txt, re.DOTALL) for i in x: print("- " + i)
正则表达式说明
.+?::匹配字段名(至少1个字符,非贪婪匹配到冒号).*?:匹配字段内容,非贪婪模式避免过度匹配(?=(?:\w+:)|\Z):正向预查,定位到下一个字段名(\w+:)或文本结尾(\Z)的位置,确保内容不会包含下一个字段的开头re.DOTALL:让.能匹配任意字符(包含换行,这里确保<br>后的内容被完整匹配)
运行结果
- Person:Tester Test<br> - Count:1<br> - Testing:test<br> - Additional Information:test1<br>test2<br>test3<br> - Temp:123<br>
内容的提问来源于stack exchange,提问作者Scooby
相关产品推荐
相关产品推荐

