Python正则表达式带现在完成时的动词选择
在给定的字符串中,我试图捕捉现在完成时的动词。我通过在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) 结果是: >>&
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
完成了
重新导入
句子=“蝙蝠侠从未展示过他的真实身份,但为高谭市做了这么多好事”
动词=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的答案该问题与贪婪的*
或懒惰的*?
或占有的*+
量词无关。非常有效,再次感谢!