Regex python正则表达式:如何获取从某个单词到文本末尾的最小子字符串?
我正在分析一个文本,我想提取从某个单词出现到文本结尾的最小子字符串。我特别的问题是,这个词可能出现在我文本的几个部分 我尝试了以下方法:Regex python正则表达式:如何获取从某个单词到文本末尾的最小子字符串?,regex,python-3.x,Regex,Python 3.x,我正在分析一个文本,我想提取从某个单词出现到文本结尾的最小子字符串。我特别的问题是,这个词可能出现在我文本的几个部分 我尝试了以下方法: pattern = re.compile('(word)(.*?)$', re.DOTALL) result = re.search(pattern, MY_TEXT).group() 我的问题是,这不会导致返回尽可能最小的字符串,而是返回文本中找到的最大字符串(即:第一次出现的word,直到文本结束,而不是最后一次出现)。我确信在第二个括号内的*之后添加?
pattern = re.compile('(word)(.*?)$', re.DOTALL)
result = re.search(pattern, MY_TEXT).group()
我的问题是,这不会导致返回尽可能最小的字符串,而是返回文本中找到的最大字符串(即:第一次出现的word
,直到文本结束,而不是最后一次出现)。我确信在第二个括号内的*
之后添加?
字符可以解决问题,但事实并非如此
输入示例:
text = "Pokémon is a media franchise managed by The Pokémon Company, a Japanese consortium between Nintendo, Game Freak, and Creatures.\nThe franchise began as Pokémon Red and Green (later released outside of Japan as Pokémon Red and Blue)."
word = 'Pokémon'
我希望我的结果是字符串:Pokémon Red and Blue)。
,但现在我得到了整个文本
我怎样才能得到我所期望的?
提前感谢。我猜您希望将
Pokémon
的最后一个实例提取到输入字符串的末尾,例如这个表达式
^.*(Pokémon.*)$
很可能会这样做
您当前的模式
(神奇宝贝)(.*?$
有两个捕获组,其中它将只匹配第一个出现的单词
,因为第二个组一直匹配到字符串末尾
为了得到最后一个单词,您可以使用*神奇宝贝
,因为*
将首先匹配到字符串的末尾,并将回溯到它可以匹配神奇宝贝
然后字符串的其余部分将由以下值匹配:*
该值位于第一个捕获组中
^.*(Pokémon .*)$
|
创建更具动态性的模式
text = "Pokémon is a media franchise managed by The Pokémon Company, a Japanese consortium between Nintendo, Game Freak, and Creatures.\nThe franchise began as Pokémon Red and Green (later released outside of Japan as Pokémon Red and Blue)."
word = "and"
pattern = r"^.*(" + re.escape(word) + ".*)$"
regex = re.compile(pattern, re.DOTALL)
result = re.search(regex, text).group(1)
print(result)
结果
蓝色)
如果单词也可以是句子中的最后一个单词,则可以使用否定的前瞻性断言右侧的字符不是非空白字符(?!\S)
^.*(Pokémon(?!\S).*)$
示例输入和预期输出?要获得结果,您可以尝试
^.*(神奇宝贝。*)$
结果在第1组中。See在本例中工作得很好,但我如何才能得到更一般化的问题结果?你的意思是动态添加单词,后跟空格或单词边界吗?你的问题是,懒惰的?
不计算第二次出现的次数,只要他遇到第一次。您可以添加一个前瞻来进行检查。类似于:”(word)(?!*word)。*$”