匹配文本块

问题描述 投票:0回答:1

我有一些看起来像这样的文字,

PIN ABC
  DIRECTION IN;
  PORT
    RECT 10 20 20 40;
  END
END ABC

PIN ABC2
  DIRECTION OUT;
  PORT
    RECT 10 20 20 40;
  END
END ABC2

我需要提取存在于PIN xxx和END xxx之间的PIN定义块。我试图用正则表达式解析文本文件,我没有得到所需的结果,因为我有嵌套的END语句。

with open(f,'r') as fh:
    all = fh.read()
re.search('PIN(.*)END', all, re.DOTALL)

我真的需要搜索PIN xxx和END xxx作为块标记

有办法吗?

python regex python-3.x
1个回答
4
投票

如果您在单个字符串中读取文件内容,则可以使用此正则表达式将PIN中的文本块与END匹配:

^PIN (\S+).*^END \1$

RegEx Demo

RegEx分手:

  • ^:开始吧
  • PIN:匹配文字文本"PIN "
  • (\S+):匹配1个非空格字符并将其捕获为组#1
  • .*:匹配任何字符的0或更多
  • ^END:在开始时匹配END
  • \1:反向引用第1组
  • $:结束

要使用的标志是MULTILINEDOTALL


PS:正如cbwheels和Wiktor评论的那样,如果输入文本是大尺寸的话,在这个正则表达式中使用惰性量词,即^PIN (\S+).*?^END \1$可能表现得更好。

© www.soinside.com 2019 - 2024. All rights reserved.