我的文字看起来像是:
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
值不会导致异常,但第二个和第三个值会导致异常。
答案 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
..."
答案 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)
第一场比赛将包含文字。
答案 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;,然后使用这两个索引来获取字符串的片段。