如何匹配此模式和字符串中的最后一个 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))
这波值不值你下载
>>>
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))
这波值不值你下载
>>>