Python re.findall()在使用\w*$时返回空元素,但预期只返回最后一个单词

Python re.findall()在使用\w*$时返回空元素,但预期只返回最后一个单词,python,regex,python-3.x,Python,Regex,Python 3.x,我尝试使用python正则表达式,并尝试使用^\w*和\w*$从字符串中获取第一个和最后一个单词。但我得到了以下结果: >>> re.findall(r'^\w*', 'This is a test string') ['This'] #to get the last word >>> re.findall(r'\w*$', 'This is a test string') ['string', ''] 有人能解释一下这个regexp是如何工作的,以及为什

我尝试使用python正则表达式,并尝试使用
^\w*
\w*$
从字符串中获取第一个和最后一个单词。但我得到了以下结果:

>>> re.findall(r'^\w*', 'This is a test string')
['This']

#to get the last word
>>> re.findall(r'\w*$', 'This is a test string')
['string', '']
有人能解释一下这个regexp是如何工作的,以及为什么我会在string(
['string',''']
)后面得到空元素吗。
注意:它与
^\w+
\w+$

一起工作。尝试此操作,它将给出第一个和最后一个单词
re.findall(r'^(\w+).*\b(\w+).*?$,“这是一个测试字符串”)
正则表达式的常见用法:
*
可以匹配空字符串
\w
只匹配单词字符,因此
\w*
匹配0+个单词字符,在字符串结尾之前停止。这是第一场比赛。然后,第二个匹配是正则表达式也匹配结尾处的空字符串。有些人可能想知道为什么
$
不“gobble”字符串结尾位置:因为它是一个零宽度断言,所以它不使用文本(即正则表达式索引保持在尝试此模式之前的位置,这是
(?!^)的原因之一)
(?(lookarounds也是零宽度断言)是相等的。尝试此操作,它将给出第一个和最后一个单词
re.findall(r'^(\w+).*\b(\w+).*?$,'这是一个测试字符串')
正则表达式的一个常见情况是:
*
可以匹配空字符串。
\w
只匹配单词字符,因此
\w*
匹配0+单词字符,在字符串结尾之前停止。这是第一个匹配。然后,第二个匹配出现,因为正则表达式也匹配结尾的空字符串。有些人可能想知道为什么
$
不匹配“gobble”字符串结尾位置:因为它是一个零宽度断言,所以它不会使用文本(即正则表达式索引保持在尝试此模式之前的位置,这就是为什么
(?!^)
(?(lookarounds也是零宽度断言)相等的原因)。