python正则表达式拆分可以进入(' ca'," n' t")

时间:2014-12-26 17:44:41

标签: python regex nlp

免责声明:此问题基于书籍"Natural Language Processing with Python"中的一个问题。

我希望:

1)用" n&#t; t"分开单词:例如" can&#t; t"到(" ca"," n' t"),

2)也匹配""等词。 """

我得到了正确答案,但不确定原因。特别是,为什么终端锚($)会使" \ w +"不那么贪婪并阻止它匹配" n"?

import re
words = ["can't", 'dog']

#Not the write answer b/c \w+ matches the "n"
[re.findall(r"(\w+)(n't)?", w) for w in words] # [[('can', ''), ('t', '')], [('dog', '')]]

#Somehow end of line anchor stops \w+ from matching 'n'
[re.findall(r"(\w+)(n't)?$", w) for w in words] #[[('ca', "n't")], [('dog', '')]]

谢谢。

3 个答案:

答案 0 :(得分:2)

使用$意味着表达式必须一直到行的末尾(或者在这种情况下,字符串的结尾)。 (请注意,在该表达式中,n't是可选的,但$不是。)\w+可以匹配" n"但不是撇号。如果\w+匹配"可以",那么为了一直到达行的末尾,表达式(n't)?$的其余部分必须与其余部分匹配字符串"'t",它没有。

当您不使用$时,表达式不会被强制匹配整个字符串。然后\w+可以匹配"can",它就会停在那里而不再匹配。

答案 1 :(得分:1)

默认情况下,

+贪婪。因此\w+正则表达式中的(\w+)(n't)?贪婪地匹配字符串n中的can't,然后它不会回溯以获得can't的结果,因为您将(n't)?的下一个模式设为可选。

为了避免这种情况,您需要在?符号旁添加非贪婪量词+,例如

(\w+?)(n't)?

一旦找到像(\w+)这样的子字符串,就会停止使用此n't模式消费字词。

DEMO

>>> words = ["can't", 'dog']
>>> [re.findall(r"(\w+?)(n't)?\b", w) for w in words]
[[('ca', "n't")], [('dog', '')]]

在可选组旁边添加单词边界将为您提供所需的输出,因为我们将前一个\w+?模式声明为非贪婪,我们还将以下(n't)作为可选项。所以它拆分输入字符串。在可选组旁边添加单词边界\b后,它确保在匹配的字符串后面必须有单词边界。

答案 2 :(得分:1)

(\w+)(?=n't|$)(n't)?

您也可以尝试使用此功能。请使用re.findall。请参阅demo.Grab捕获。

https://regex101.com/r/dU7oN5/30