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
你误解了这种模式.名词联合列表周围没有组,因此第一个\s是eggs选项的一部分,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)
现在两个空格都是输出的一部分.