Python正则表达式带现在完成时的动词选择

Python正则表达式带现在完成时的动词选择,python,regex,nlp,re,linguistics,Python,Regex,Nlp,Re,Linguistics,在给定的字符串中,我试图捕捉现在完成时的动词。我通过在python中使用以下正则表达式来实现这一点: import re sentence = "The Batman has never shown his true identity but has done so much good for Gotham City" verb = re.findall(r'has\s[^\,\.\"]{0,50}done', sentence) 结果是: >>&

在给定的字符串中,我试图捕捉现在完成时的动词。我通过在python中使用以下正则表达式来实现这一点:

import re
sentence = "The Batman has never shown his true identity but has done so much good for Gotham City"

verb = re.findall(r'has\s[^\,\.\"]{0,50}done', sentence)

结果是:

>>> print(verb)

['has never shown his true identity but has done']
在这里,正确的答案应该是‘havedone’,但‘has’from‘从未显示’是错误的‘has’catched。部分
[^\,\.\“]{0,50}
允许对“has”和“done”之间的内容有一些自由,这在这里没有出现,但对我的真实数据很有用。但是,它捕获它找到的第一个“has”,这并不总是好的。是否可以取而代之的是最后一个“has”?

您可以在这里使用一个解决方案:

\bhas\s(?:(?!\bhas\b)[^,.“]){0,50}?\bOne\b

详细信息

  • \bhas
    -一个完整的单词
  • \s
    -一个空格字符
  • (?:(?!\bhas\b)[^,.“]{0,50}?
    -除了
    ”之外的任何字符,零到五十次出现,但尽可能少,这不会启动整个单词
    has
  • \bdone\b
    -一个完整的单词
    完成了
见a:

重新导入
句子=“蝙蝠侠从未展示过他的真实身份,但为高谭市做了这么多好事”
动词=re.findall(r'\bhas\s(?:(?!\bhas\b)[^,.“]){0,50}?\bOne\b',句子)
印刷(动词)
#=>[“已完成”]

如果你想继续使用regex,请使用
\bhas\s(?:(?!\bhas\b)[^,.“]){0,50}?\bOne\b
;它将匹配最长的字符串。使用吝啬的
{0,50}?
。这是一个非常常见的常见问题。我认为这叫做贪婪vs懒惰搜索,请查阅。谢谢您的帮助。是的,我不知道贪婪搜索和懒惰搜索之间的区别。但是,
{0,50}?
本身不起作用。请参阅@WiktorStribiżew的答案该问题与贪婪的
*
或懒惰的
*?
或占有的
*+
量词无关。非常有效,再次感谢!