Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式匹配引号之间字符串的第一次出现,但排除某些单词?_Python_Regex_String - Fatal编程技术网

Python 正则表达式匹配引号之间字符串的第一次出现,但排除某些单词?

Python 正则表达式匹配引号之间字符串的第一次出现,但排除某些单词?,python,regex,string,Python,Regex,String,我有一个正则表达式,它捕获文本文件中引号内的所有字符,但我想: 仅匹配此模式的第一个匹配项 从此模式匹配中排除某些单词 以下是我目前掌握的情况: ((?:\\.|[^"\\])*) 匹配引号内的所有文本,如下所示: “这是一篇打印有单词的文本?” 但是,我希望该模式只匹配第一个匹配项,因此我认为在某个点上需要一个{1} 然后,我想排除某些单词,我有这样一个: ^(?!.*word1|word2|word3) 但我对正则表达式不太熟悉,无法将其全部放在一起。我认为您可以使用此正则表达式匹配

我有一个正则表达式,它捕获文本文件中引号内的所有字符,但我想:

  • 仅匹配此模式的第一个匹配项
  • 从此模式匹配中排除某些单词
以下是我目前掌握的情况:

((?:\\.|[^"\\])*)
匹配引号内的所有文本,如下所示:

“这是一篇打印有单词的文本?”

但是,我希望该模式只匹配第一个匹配项,因此我认为在某个点上需要一个{1}

然后,我想排除某些单词,我有这样一个:

^(?!.*word1|word2|word3)

但我对正则表达式不太熟悉,无法将其全部放在一起。

我认为您可以使用此正则表达式匹配双引号中第一个出现的字符串,该字符串不包含列表中的单词:

^.*?(?!"[^"]*?\b(?:word1|word2|word3)\b[^"]*?")"([^"]+?)"(?=(?:(?:[^"]*"[^"]*){2})*[^"]*$)

:

输出:

this is some text word4 with the word printed in it? 
至于可维护性,可以从任何来源提取排除的单词,并且可以动态构建正则表达式。

是否必须是一个正则表达式才能同时满足所有这些要求?如果您只使用一个简单的正则表达式来查找带引号的字符串,然后根据排除的单词黑名单过滤所有匹配项,最后选择第一个剩余的,那么您的代码可能会保持更高的可维护性

excluded = ('excluded', 'forbidden')
text = 'So, "this string contains an excluded word". "This second string is thus the one we want to find!" another qu"oted st"ring ... and another "quoted string with a forbidden word"'

import re
quoted_strings = re.findall('".*?"', text)
allowed_quoted_strings = [q for q in quoted_strings if any(e in q for e in excluded)]
wanted_string = allowed_quoted_strings[0]
或者如果你喜欢用一个巨大的单一表达

import re
wanted_string = [q for q in re.findall('".*?"', 'So, "this string contains an excluded word". "This second string is thus the one we want to find!" another qu"oted st"ring ... and another "quoted string with a forbidden word"') if any(e in q for e in ('excluded', 'forbidden'))][0]

您有一些示例输入和预期输出?您所说的仅匹配第一个匹配项是什么意思?通过排除某些单词,你的意思是排除包含这些单词的引用短语吗?这里列出了使用正则表达式的地方-给出一个例子try@Matt-如果元素中有两个带引号的短语,我不希望模式抓住第二个(或更大的)出现。在引用的短语中,排除某些“停止”词。@dharkko请提供一个完整的示例以及预期的输出。为什么还要使用两次“向前看”和“向后看”?糟糕透了。演示链接到的RegEx站点只显示引用语句的第一次出现,但是显示了多个匹配的出现。知道为什么会有这样的分歧吗?@Stribizev-这给了我一个不同的角度来重新讨论我的问题,但你的模式目前并不是只抓住带引号字符串的第一个实例,而是忽略第二个或更大的实例,如果该实例包含停止字。我将采取这一点,并拍摄匹配的唯一实例1@hwnd:我想该睡觉了:)谢谢你的关注@TonyDiNitto:Rubular始终显示所有匹配项。在Regex101上,我们可以使用
g
选项来匹配所有或仅匹配一个事件。
import re
wanted_string = [q for q in re.findall('".*?"', 'So, "this string contains an excluded word". "This second string is thus the one we want to find!" another qu"oted st"ring ... and another "quoted string with a forbidden word"') if any(e in q for e in ('excluded', 'forbidden'))][0]