首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重新匹配两个单词之间的所有文本。

重新匹配两个单词之间的所有文本。
EN

Stack Overflow用户
提问于 2021-10-31 10:09:25
回答 2查看 55关注 0票数 1

我有一个文本文件,其内容遵循一组规则。下面是文件的一个片段:

代码语言:javascript
复制
<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

我想使用re提取两个类型:标记之间的所有文本,例如,我想提取以下内容:

代码语言:javascript
复制
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

还有这个

代码语言:javascript
复制
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

使用正则表达式。我在python上试过这个

代码语言:javascript
复制
re.findall('Type: [\w\s]+)Type:', string)

但这给了我一个空名单。要实现这一点,正确的re表达式应该是什么?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-31 10:15:29

在您的模式Type: [\w\s]+)Type:中有一个未关闭的)

模式中匹配Type: 2次的问题是,当您第二次在模式中匹配它时,它将阻止下一次匹配,因为它已经匹配了。

您可以使用模式来匹配Type:后面跟着不以它开头的所有行。

代码语言:javascript
复制
^Type: .*(?:\n(?!Type: ).*)*

模式匹配:

  • 字符串的^开始
  • Type:匹配
  • .*与行的其余部分匹配
  • (?:非捕获群
    • \n(?!Type: ).*匹配换行符并断言它不以Type:开头,然后匹配整行

  • )*关闭非捕获组并选择repeta

使用re.findall,行将是

代码语言:javascript
复制
re.findall(r"^Type: .*(?:\n(?!Type: ).*)*", string, re.M)

Regex演示 x- Python演示

票数 2
EN

Stack Overflow用户

发布于 2021-10-31 11:35:15

试一试

代码语言:javascript
复制
"(?ms)^Type:(?:(?!^Type:).)*"

其中(?ms)打开re.MULTILINEre.DOTALL模式,因此^匹配每一行的开头,.匹配任何字符,包括换行符。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69785817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档