无法找到合适的正则表达式

时间:2014-12-04 05:56:53

标签: python regex

以下是一些日志:

2014-12-04T03:44:55.059+0000: 3155402.861: [GC 3155402.861: [ParNew: 52663K->161K(59008K), 0.0037300 secs] 81475K->28973K(104200K), **0.0038550** secs] [Times: user=0.01 sys=0.01, real=0.01 secs]

2014-12-04T04:26:31.955+0000: 3157899.757: [GC 3157899.757: [ParNew: 52641K->161K(59008K), 0.0014220 secs] 81453K->28973K(104200K), **0.0015160** secs] [Times: user=0.01 sys=0.01, real=0.00 secs]

2014-12-04T05:08:48.764+0000: 3160436.567: [GC 3160436.567: [ParNew: 52641K->163K(59008K), 0.0028550 secs] 81453K->28975K(104200K), **0.0029850** secs]

我想过滤'**'

中突出显示的值

这是我的正则表达式。它的工作原理除了最后一行

patt = re.compile(r'''\[GC.*([0-9]+\.[0-9]+).secs\].+\[.*''')

这是另一个正则表达式,只适用于最后一行,但没有其他行

patt = re.compile(r'''\[GC.*([0-9]+\.[0-9]+).secs\].?''')

我需要帮助来提出一个通用的reg ex,它将准确地获取值...任何帮助非常感谢

2 个答案:

答案 0 :(得分:2)

积极展望将有所帮助

正则表达式可以是

GC.*?([\d.]+)(?= secs\](?: \[Time|$))

Regex Example

  • (?= secs\](?: \[Time|$)正面向前看。断言数字后跟secs] [Time或字符串结尾$

使用示例

>>> str="""2014-12-04T03:44:55.059+0000: 3155402.861: [GC 3155402.861: [ParNew: 52663K->161K(59008K), 0.0037300 secs] 81475K->28973K(104200K), 0.0038550 secs] [Times: user=0.01 sys=0.01, real=0.01 secs]"""
>>> str1="""2014-12-04T05:08:48.764+0000: 3160436.567: [GC 3160436.567: [ParNew: 52641K->163K(59008K), 0.0028550 secs] 81453K->28975K(104200K), 0.0029850 secs]"""
>>> str2="""2014-12-04T04:26:31.955+0000: 3157899.757: [GC 3157899.757: [ParNew: 52641K->161K(59008K), 0.0014220 secs] 81453K->28973K(104200K), 0.0015160 secs] [Times: user=0.01 sys=0.01, real=0.00 secs]"""

>>> re.findall(r'GC.*?([\d.]+)(?= secs\](?: \[Time|$))', str2)                                                                                                                 
['0.0015160']
>>> re.findall(r'GC.*?([\d.]+)(?= secs\](?: \[Time|$))', str1)
['0.0029850']
>>> re.findall(r'GC.*?([\d.]+)(?= secs\](?: \[Time|$))', str)
['0.0038550']
>>>

答案 1 :(得分:1)

您可以使用positive look-ahead

>>> re.findall(r' [\d\.]+ (?=sec)',s)
[' 0.0037300 ', ' 0.0014220 ', ' 0.0028550 ']