Python - 不了解此连锁正则表达式模式的返回结果

Dar*_*nes 2 python regex concatenation

我是一个Python newb试图更好地理解正则表达式.就在我认为我已经掌握了基础知识的时候,有些东西会让我失望 - 比如下面的内容:

>>> import re

>>> text = "Some nouns like eggs egg bacon what a lovely donkey"
>>> noun_list = ['eggs', 'bacon', 'donkey', 'dog']
>>> noun_patt = r'\s' + '|'.join(noun_list) + r'\s'
>>> found = re.findall(noun_patt, text)
>>> found
[' eggs', 'bacon', 'donkey']
Run Code Online (Sandbox Code Playgroud)

因为我设置了正则表达式模式来找到'whitespace' + 'pipe joined list of nouns' + 'whitespace'- 为什么:

' eggs'被发现之前有空间而不是之后? 'bacon'被发现它的两边都没有空格? 'donkey'被发现它的两边都没有空格,之后没有空格?

结果我期待: [' eggs ', ' bacon ']

我使用的是Python 2.7

Mar*_*ers 5

你误解了这种模式.名词联合列表周围没有组,因此第一个\seggs选项的一部分,bacon而且donkey选项没有空格,dog选项包括最后的\s元字符.

您想在名词周围放置一个组来分隔该|选项适用的内容:

noun_patt = r'\s(?:{})\s'.format('|'.join(noun_list))
Run Code Online (Sandbox Code Playgroud)

这里的非捕获组((?:...))限制了|选项适用的内容.这些\s空间现在不属于该组,因此不属于4种选择.

您需要使用非捕获组,因为如果您要使用常规(捕获)组,.findall()则只返回名词,而不是空格.

演示:

>>> text = "Some nouns like eggs egg bacon what a lovely donkey"
>>> import re
>>> text = "Some nouns like eggs egg bacon what a lovely donkey"
>>> noun_list = ['eggs', 'bacon', 'donkey', 'dog']
>>> noun_patt = r'\s(?:{})\s'.format('|'.join(noun_list))
>>> re.findall(noun_patt, text)
[' eggs ', ' bacon ']
Run Code Online (Sandbox Code Playgroud)

现在两个空格都是输出的一部分.