需要一个正则表达式,匹配包含空格的短语,但不匹配右侧的空格?

2 投票
3 回答
1043 浏览
提问于 2025-04-16 20:08

我有一个日志文件,我们用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*::

撰写回答