我想在python正则表达式python中加上“ is”一词后的整个句子。
s = '''Robert is an English actor, model and musician.
He started his film career by playing Cedric Diggory in Harry Potter.'''
r = re.findall(r'(?:is) (.*)',s)
print(r)
我希望输出为:
'an English actor, model and musician'
但是实际输出是:
['an English actor, model and musician','film career by playing Cedric Diggory in Harry Potter']
答案 0 :(得分:1)
由于您只希望从is
到句子结尾,this RegEx将起作用:
\bis\s+(.+?)\.
,它需要与标志s
一起使用,以便.
也与换行符匹配,以防句子分散在多行中。我将+
与.
一起使用,因为.*
会使整个正则表达式匹配,即使is
和.
之间没有任何匹配,这对于句子。
将.
从输出中移出,将其移出捕获括号。 “句子的其余部分”在第一个捕获组中。
但是请注意,如果句子中有Mrs.
之类的东西(并且有很多短语包含.
可能属于一个句子),那么这种简单的方法就行不通了。
解析自然语言非常困难。如果你有 任何比简单,定义明确和可预测的文本都复杂的事情,那么您应该使用专用的库。快速搜索显示例如全面的库NLTK和spaCy。
This helpful regex tool提供了有关其匹配方式的说明。您尝试的变化
(\bis\b)([\s\S]*)
有关详细信息,请参见链接页面。评论
它将创建两个捕获组,目标输出是第二个捕获组,您可以使用 $ 2 对其进行调用。
第一组在您唯一的 is 实例周围创建单词边界。
您可以使用 \ 转义任何语言特定的元字符。
答案 1 :(得分:1)
您需要在is
周围使用单词边界,以便仅is
可以匹配整个单词,而不能部分匹配其他单词,例如它与his
匹配(这不是故意的),并且使用此正则表达式,
\bis\s+([^.]*)
在没有单词边界的情况下,甚至his
也会匹配并为您提供您不想要的第二句话。
尝试此修改后的Python代码,
import re
s = '''Robert is an English actor, model and musician.
He started his film career by playing Cedric Diggory in Harry Potter.'''
r = re.findall(r'\bis\s+([^.]*)',s)
print(r)
仅打印
['an English actor, model and musician']
答案 2 :(得分:0)
使用partition()
可能会更容易:
splice = s.partition("is")[2] # an English actor, model and musician. He started his film career by playing Cedric Diggory in Harry Potter.
然后split()
:
final = splice.split('.')[0]
答案 3 :(得分:-1)
之所以这样,是因为.*
是贪婪的,如果可能(并且可以)匹配所有其余部分。
由于您具有新的行分隔符,因此可以根据需要使用它。
仅对该字符串使用正则表达式,您可以使用正向(?<=is)
来做到这一点。 将匹配但不包含在结果中
s = '''Robert is an English actor, model and musician.
He started his film career by playing Cedric Diggory in Harry Potter.'''
r = re.findall(r'(?<=is).*\n',s)
print(r)
[' an English actor, model and musician.\n']