如何匹配此模式和字符串中的最后一个 space?

How to match the last space in this pattern and string?

s = "DL666 DL777 DL888 这波值不值你下载"

我想匹配从最后一个 space 开始的字符,所以匹配应该是:

m = "这波值不值你下载"

我写了这个模式,但是没有用:

p = '\s.+?$'

我以为?用于非贪婪搜索。

如果您坚持为此使用正则表达式,我会贪婪地搜索“任何后跟白色space”,然后使用捕获组获取之后的所有内容。

import re

s = "DL666 DL777 DL888 这波值不值你下载"
m = re.match(r'^.*\s(.*)$', s).group(1)
# '这波值不值你下载'

一个更直接的正则表达式,如果您满足于不从行首开始,那么

m = re.search('[^\s]*$', s).group(0)
# '这波值不值你下载'

但是,对于这么简单的事情,您最好只使用 str.rindex() 来查找最后一次出现的 space,然后取出它后面的所有内容。:

m = s[s.rindex(' ') + 1:]
# '这波值不值你下载'

它不起作用的原因是因为它试图从左到右找到一个匹配项。

正则表达式 \s.+?$ 表示:

  • 配一白space\s
  • 后跟任何数字 +? 的任何字符 .
  • 直到到达行尾(或字符串)$

? 之后的 $ 使 ? 无用。

这就是为什么它匹配字符串中第一个 space 之后的所有内容。 DL777 DL888 这波值不值你下载 Demo

另一方面,如果您将 . 更改为任何 除了 白色 space (\S),您将得到你想要什么。当你这样做的时候,你也可以删除 ?。并且由于您不关心非白色 space 之前的白色 space,因此也去掉 \s\S+$ 匹配 这波值不值你下载 Demo

请注意,虽然这个正则表达式有效,但在他们对这个问题的回答中只使用 str.rindex() 并像 那样分割字符串会更便宜。

您还可以在 vim 中用作搜索字符串的更简单的正则表达式是:

\S\+$

它匹配每个非空格直到行尾(或字符串,如果 python)。请注意,您必须在 vim.

中转义 +

这是 python 脚本:

import re
s = "DL666 DL777 DL888 这波值不值你下载"
m = re.search(r'\S+$', s)
print(m.group(0))

我在 python3:

测试过
$ python3
Python 3.6.8 (default, Mar  9 2021, 15:08:44) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44.0.3)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> s = "DL666 DL777 DL888 这波值不值你下载"
>>> m = re.search(r'\S+$', s)
>>> print(m.group(0))
这波值不值你下载
>>>