2

我是一个 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

4

1 回答 1

5

你误解了模式。名词联合列表周围没有组,所以第一个\seggs选项的一部分,bacondonkey选项没有空格,dog选项包括最后的\s元字符。

您想在名词周围放置一个组来界定该|选项适用的范围:

noun_patt = r'\s(?:{})\s'.format('|'.join(noun_list))

这里的非捕获组 ( (?:...)) 对|选项适用的内容进行了限制。这些\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 ']

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

于 2013-09-26T22:01:56.123 回答