python正则表达式中的两个条件

python正则表达式中的两个条件,python,regex,Python,Regex,我不明白为什么我输出的第一项是空的,而不是@stackoverflow import re s = "I love @stackoverflow because #people are very #helpful!" re.findall(r"@|#(\w+)" , s) 输出: ['', 'people', 'helpful'] 因为它将其用作@或\w+。尝试: 因为您的正则表达式被解释为[仅匹配@,或后面有一些\w,并且只捕获\ws],所以您可以使用此正则表达式来获取这两个符号以及它们后

我不明白为什么我输出的第一项是空的,而不是@stackoverflow

import re
s = "I love @stackoverflow because #people are very #helpful!"
re.findall(r"@|#(\w+)" , s)
输出:

['', 'people', 'helpful']
因为它将其用作@或\w+。尝试:


因为您的正则表达式被解释为[仅匹配@,或后面有一些\w,并且只捕获\ws],所以您可以使用此正则表达式来获取这两个符号以及它们后面的符号:

import re
s = "I love @stackoverflow because #people are very #helpful!"
print(re.findall(r"[@#]\w+" , s))
输出:

['@stackoverflow', '#people', '#helpful']
这是因为模式@|\w+与以下模式匹配:

@

\w+

当它与|的第一面匹配时,模式不会捕获任何内容

您可以通过使用模式[@]\w+。

来解决这个问题,这是因为r@|\w+与r?:@|?:\w+相同,所以您的正则表达式会查找后跟某个内容的散列符号,或者只查找at符号

您的代码将返回预期的结果:

正则表达式的第一部分没有任何捕获组,因此它与@匹配并返回一个空字符串。 第二部分有一个匹配组并返回 要匹配@stackoverflow中的stackoverflow,请尝试以下操作:

>>> re.findall("[@#](\w+)", s)
['stackoverflow', 'people', 'helpful']
这与明确指定优先级相同:

>>> re.findall("(?:@|#)(\w+)", s)
['stackoverflow', 'people', 'helpful']
?:@|\w+表示: *匹配@or,但不要捕获它 *如果以上匹配,则匹配\w+并捕获结果,因为。。。是一个抓捕小组

在re.findall的上下文中,结果列表中将只显示捕获组

>>> re.findall("(?:@|#)(\w+)", s)
['stackoverflow', 'people', 'helpful']