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

时间:2013-09-26 21:59:53

标签: python regex concatenation

我是一个Python新手试图更好地理解正则表达式。就在我认为我已经掌握了基础知识的时候,有些东西会引发我的兴趣 - 例如:

>>> 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']

因为我将正则表达式设置为'whitespace' + 'pipe joined list of nouns' + 'whitespace' - 所以:

发现{p> ' eggs'前面有空格而不是之后? 发现'bacon'两边都没有空格? 发现'donkey'的任何一侧都没有空格,之后没有空格?

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

我正在使用Python 2.7

1 个答案:

答案 0 :(得分:5)

你误解了这种模式。联合名词列表周围没有组,因此第一个\seggs选项的一部分,bacondonkey选项没有空格,{ {1}}选项包含最终的dog元字符。

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

|

此处的非捕获组(noun_patt = r'\s(?:{})\s'.format('|'.join(noun_list)) )对(?:...)选项应用的内容进行了限制。 |空格现在不属于该组,因此不属于4个选项。

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

演示:

.findall()

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