免责声明:此问题基于书籍"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', '')]]
谢谢。
答案 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
模式消费字词。
>>> 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)