s = "DL666 DL777 DL888 这波值不值你下载"
我想匹配从最后一个空格开始的字符,所以匹配应该是:
m = "这波值不值你下载"
我写了这个模式,但没有用:
p = '\s.+?$'
我还以为呢?是为了不贪婪的搜索。
发布于 2021-04-22 19:47:29
如果您坚持为此使用regex,我只会贪婪地搜索“任何后面的空格”,然后使用一个捕获组来获取之后的所有内容。
import re
s = "DL666 DL777 DL888 这波值不值你下载"
m = re.match(r'^.*\s(.*)$', s).group(1)
# '这波值不值你下载'
一个更简单的正则表达式,如果您对不从行的开头开始感到满意的话,将是
m = re.search('[^\s]*$', s).group(0)
# '这波值不值你下载'
然而,对于这么简单的事情,您最好只使用str.rindex()
来查找空间的最后一次出现,然后将所有内容都放在后面。
m = s[s.rindex(' ') + 1:]
# '这波值不值你下载'
发布于 2021-04-22 19:55:06
它不能工作的原因是因为它试图从左到右找到一个匹配的。
regex \s.+?$
的意思是:
\s
+?
,任何字符的.
$
的末尾为止$
在?
之后使?
变得无用。
这就是为什么在字符串中的第一个空格之后匹配所有内容的原因。DL777 DL888 这波值不值你下载
演示
另一方面,如果您将.
更改为除空白(\S
)以外的任何内容,您就会得到所需的东西。当你在做它的时候,你最好移除?
。而且,由于您不关心非空白之前的空白,所以也要去掉\s
。\S+$
匹配这波值不值你下载
演示
注意,虽然这个正则表达式有效,但是在回答这个问题时只使用str.rindex()
并像GCG建议一样分割字符串比较便宜。
发布于 2021-04-22 20:29:03
您也可以在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))
这波值不值你下载
>>>
https://stackoverflow.com/questions/67223717
复制相似问题