正则表达式:最接近匹配

时间:2014-07-14 18:01:11

标签: python regex

我的文字看起来像是:

data="""
XYZ
sometext1
...
XYZ
sometext2
...
TPoint
sometext3
...
XYZ
sometext4
...
TPoint
"""

我想在最近sometext2 ...XYZ之间提取TPoint文字。

我的第一次尝试是

m = re.search("XYZ(.*?)TPoint", data, re.DOTALL)
print m.group(1)

但这给出了

sometext1
...
XYZ
sometext2
...

如何提取

sometext2
...

我可以进行一些后期处理来提取我想要的部分(比如rfind(&#39; XYZ&#39;)),但是想知道是否有办法单独使用正则表达式对其进行编码< /强>

(如果您对真实数据感兴趣:我有一个日志文件,TPoint对应于某种异常,XYZ对应于感兴趣的消息;所以我尝试了将消息链接到异常。XYZ中的第一个data值不会导致异常,但第二个和第三个值会导致异常。

4 个答案:

答案 0 :(得分:3)

好的, 我的坏!!
让它在这里。

XYZ([^XYZ]*?)TPoint //doesnt work

XYZ(((?!XYZ).)*?)TPoint //works


result = re.findall("XYZ(((?!XYZ).)*?)TPoint", data)

for x in result:
   print x  

输出:

"sometext2
...",  
"sometext4
..."

见这里:http://regex101.com/r/zC8iW7/6

答案 1 :(得分:1)

尝试以下方法:

reobj = re.compile("(XYZ(.*?))+?TPoint", re.DOTALL)
for match in reobj.finditer(subject):
    print (match.group(2))

#or 
(reobj.finditer(subject).next()).group(2)

第一场比赛将包含文字。

此处有demoanother

答案 2 :(得分:0)

https://docs.python.org/2/library/re.html

在re模块中,有一些模式使用前瞻和后面的断言......

(?&lt; = ...)看起来落后于

examplePattern =  "(?<=XYZ)." #Pattern that matches the first character after XYZ

(?= ...)展望未来

a =  re.search("(?<=XYZ)((?!XYZ).)*?(?=TPoint)",data,re.S).group()# returns desired output

答案 3 :(得分:0)

我会考虑不使用正则表达式,如下所示:

firstTPOINT = data.find('TPOINT')
lastXYZ = data.rfind('XYZ', 0, firstTPOINT)
captured = data[lastXYZ - len('XYZ'):firstTPOINT]

它可以做得更漂亮,我确定,但总的想法就在那里。找到第一个&#39; TPOINT&#39;的位置,从那里向后看以找到之前的&#39; XYZ&#39;,然后使用这两个索引来获取字符串的片段。