需要一个正则表达式,匹配包含空格的短语,但不匹配右侧的空格?
我有一个日志文件,我们用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() 来之后去掉这些空格,但我更想直接在正则表达式中就不把它们选上 - 有没有办法做到这一点呢?
谢谢,
Victor
3 个回答
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']
这个方法的原理是确保这个短语的开头和结尾都是一个字母或数字(即使只有一个字母或数字也可以)。我看到Leif的方法也是这样,但我不想花太多精力去解释他的工作原理(有点困了)...
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
你不能这样匹配结尾的空格..
::(?P<phrase>[\w\s]+?)\s*::