我是一个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'
- 所以:
' eggs'
前面有空格而不是之后?
发现'bacon'
两边都没有空格?
发现'donkey'
的任何一侧都没有空格,之后没有空格?
我期待的结果:[' eggs ', ' bacon ']
我正在使用Python 2.7
答案 0 :(得分:5)
你误解了这种模式。联合名词列表周围没有组,因此第一个\s
是eggs
选项的一部分,bacon
和donkey
选项没有空格,{ {1}}选项包含最终的dog
元字符。
您想在名词周围放置一个组来分隔\s
选项适用的内容:
|
此处的非捕获组(noun_patt = r'\s(?:{})\s'.format('|'.join(noun_list))
)对(?:...)
选项应用到的内容进行了限制。 |
空格现在不属于该组,因此不属于4个选项。
您需要使用非捕获组,因为如果您要使用常规(捕获)组\s
,则只返回名词,而不是空格。
演示:
.findall()
现在两个空格都是输出的一部分。