需要一个正则表达式,包括中间的空格,但不是右边的空格?

时间:2011-06-23 07:11:27

标签: python regex parsing

我有一个日志文件,我们在Python中使用正则表达式解析每一行。

每行的一部分包含一个短语,即一个或多个单词。

例如,在下面,短语是“SOME PHRASE”。

12-09-95 10:37:46,082 [3] INFO Foobar <> - 1995-Dec-09 10:37:47.189025 --- [5571467078570868736::TYPE    ::SOME PHRASE ::1995-Dec-09 10:37:47.165672::1995-Dec-09 10:37:47.188790::00:00:00.023117]

在其他行中,它可能只是一个单词,例如“PHRASE”。

12-09-95 10:37:46,082 [3] INFO Foobar <> - 1995-Dec-09 10:37:47.189025 --- [5571467078570868736::TYPE    ::SOME PHRASE    ::1995-Dec-09 10:37:47.165672::1995-Dec-09 10:37:47.188790::00:00:00.023117]

我们需要提取短语的所有单词,包括单词之间的任何空格,但减去左侧或右侧的任何空格。

这句话很容易 - 我们正则表达式的相关部分:

::(?P<phrase>[\w\s]+)::

但是,我不确定如何使用正则表达式丢弃右边的空格 - 日志文件通常在我们想要的短语之后有一堆无关的空格。

我知道我之后可以使用str.rstrip()来删除它,但我宁愿使用正则表达式本身来取回它 - 有没有办法做到这一点?

干杯, 维克多

3 个答案:

答案 0 :(得分:2)

你无法像这样匹配尾随空格。

::(?P<phrase>[\w\s]+?)\s*::

答案 1 :(得分:0)

为什么要使用正则表达式?

>>> line = "12-09-95 10:37:46,082 [3] INFO Foobar <> - 1995-Dec-09 10:37:47.189025 --- [5571467078570868736::TYPE    ::SOME PHRASE ::1995-Dec-09 10:37:47.165672::1995-Dec-09 10:37:47.188790::00:00:00.023117]"
>>> line.split('::')[2].strip()
'SOME PHRASE'

答案 2 :(得分:0)

>>> p = re.compile('::\s*(?P<phrase>(?:\w[\w\s]*)?\w)\s*::')
>>> p.findall(': test :: test test :: ::  s  :: ::  another test:: ::third test   ::')
['test test', 's', 'another test', 'third test']

这可以通过确保短语以\ w开头和结尾(即使只有一个\ w)来实现。我知道,Leif也有,但我无法解释他的作品如何不费吹灰之力而不愿意投入其中(困倦)......