Python如何使用re匹配提取两个Type:标记之间的全部文本
问题分析
你之前写的正则返回空有四个核心原因:
- 语法错误:正则中的右括号没有对应的左括号,属于无效正则
- 字符匹配范围过窄:
[\w\s]只能匹配字母、数字、下划线和空白,无法匹配文本中的<、>、(、:等特殊字符 - 未开启跨行匹配:Python正则默认
.不匹配换行符,无法匹配多行内容 - 未覆盖末尾块场景:最后一个Type块后面没有后续的
Type:标记,原写法会遗漏最后一段
正确实现方案
正则写法
使用re.DOTALL(简写re.S)标记让.匹配换行符,配合非贪婪匹配和正向前瞻,既匹配两个Type:之间的内容,也能匹配最后一个Type:到文本末尾的内容:
import re # 你的原始文本 text = """<class 'NXOpen.Features.FeatureCollection'> Type: <class 'NXOpen.Features.DatumCsys'> FeatureName: Datum Coordinate System(0) Parents: Children: Name: , JournalIdentifier: SKETCH(1:1B) Expressions: Entities: Name: , JournalIdentifier: HANDLE R-849 Name: , JournalIdentifier: HANDLE R-850 Name: , JournalIdentifier: DATUM_CSYS(0) YZ plane Name: , JournalIdentifier: DATUM_CSYS(0) XZ plane Name: , JournalIdentifier: DATUM_CSYS(0) XY plane Name: , JournalIdentifier: DATUM_CSYS(0) X axis Name: , JournalIdentifier: DATUM_CSYS(0) Y axis Name: , JournalIdentifier: DATUM_CSYS(0) Z axis Type: <class 'NXOpen.Features.DatumCsys'> FeatureName: Datum Coordinate System(1)inf Parents: Name: , JournalIdentifier: DATUM_CSYS(0) Children: Name: , JournalIdentifier: SKETCH(1) Expressions: Entities: Name: , JournalIdentifier: HANDLE R-4283 Name: , JournalIdentifier: HANDLE R-4284 Name: , JournalIdentifier: SKETCH(1:1B) YZ plane Name: , JournalIdentifier: SKETCH(1:1B) XZ plane Name: , JournalIdentifier: SKETCH(1:1B) XY plane Name: , JournalIdentifier: SKETCH(1:1B) X axis Name: , JournalIdentifier: SKETCH(1:1B) Y axis Name: , JournalIdentifier: SKETCH(1:1B) Z axis """ # 核心提取逻辑 result = re.findall(r'^Type:.*?(?=\nType:|\Z)', text, flags=re.S | re.M)
正则说明
^Type::匹配行开头的Type:标记,re.M多行模式让^匹配每一行的开头.*?:非贪婪匹配任意字符(开启re.S后匹配范围包含换行符)(?=\nType:|\Z):正向前瞻,匹配到下一个Type:开头的行或者文本结束位置为止,不会消耗下一个Type:标记re.S:让.匹配换行符re.M:多行模式,让^识别每一行的开头
提取出来的result列表就是你需要的两个文本段,直接遍历即可拿到对应内容。
内容的提问来源于stack exchange,提问作者Aman Savaria
相关产品推荐
相关产品推荐

