我有一些看起来像这样的文字,
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作为块标记
有办法吗?
如果您在单个字符串中读取文件内容,则可以使用此正则表达式将PIN
中的文本块与END
匹配:
^PIN (\S+).*^END \1$
RegEx分手:
^
:开始吧PIN
:匹配文字文本"PIN "
(\S+)
:匹配1个非空格字符并将其捕获为组#1.*
:匹配任何字符的0或更多^END
:在开始时匹配END
\1
:反向引用第1组$
:结束要使用的标志是MULTILINE
和DOTALL
PS:正如cbwheels和Wiktor评论的那样,如果输入文本是大尺寸的话,在这个正则表达式中使用惰性量词,即^PIN (\S+).*?^END \1$
可能表现得更好。