我有一个日志文件,我们在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()来删除它,但我宁愿使用正则表达式本身来取回它 - 有没有办法做到这一点?
干杯, 维克多
答案 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也有,但我无法解释他的作品如何不费吹灰之力而不愿意投入其中(困倦)......