我有一个看起来像这样的文本:
data="""
XYZ
sometext1
...
XYZ
sometext2
...
TPoint
sometext3
...
XYZ
sometext4
...
TPoint
"""
我想在最接近的 XYZ
和 TPoint
之间提取 sometext2 ...
文本。
我的第一次尝试是
m = re.search("XYZ(.*?)TPoint", data, re.DOTALL)
print m.group(1)
但这给出了
sometext1
...
XYZ
sometext2
...
如何提取
sometext2
...
?
我可以做一些后处理来提取我想要的部分(比如 rfind('XYZ')),但想知道是否有一种方法可以单独使用正则表达式对其进行编码
(如果您对真实数据感兴趣:我有一个日志文件,TPoint
对应某种异常,XYZ
对应一条感兴趣的消息;所以我正在尝试将消息链接到异常。data
中的第一个 XYZ
值不会导致异常,但第二个和第三个会导致异常)
最佳答案
好吧,我的错!!
让它在这里。
XYZ([^XYZ]*?)TPoint //doesnt work
XYZ(((?!XYZ).)*?)TPoint //works
result = re.findall("XYZ(((?!XYZ).)*?)TPoint", data)
for x in result:
print x
输出:
"sometext2
...",
"sometext4
..."
关于python - 正则表达式 : close most match,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24742847/