Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.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
Regex 正则表达式:匹配两个字符串之间的所有字符_Regex_Python 3.x_Pattern Matching - Fatal编程技术网

Regex 正则表达式:匹配两个字符串之间的所有字符

Regex 正则表达式:匹配两个字符串之间的所有字符,regex,python-3.x,pattern-matching,Regex,Python 3.x,Pattern Matching,例如:在荷兰,花生酱被称为“pindakaas”(花生奶酪),而不是“pindaboter”(花生酱),因为“黄油”一词只用于含有实际黄油的产品 我想把奶酪和黄油之间的所有东西都搭配起来,反之亦然 目标: 黄油被称为“花生奶酪” 奶酪)而不是“品达博特”(花生酱) 编辑: 使用的语言是Python 3.7,当前使用的reg exp是cheese(.*)butter示例中的问题是,第一个目标的最后一个单词是源字符串中第二个目标的第一个单词;“normal”正则表达式语法使重新引擎使用它匹配的字

例如:在荷兰,花生酱被称为“pindakaas”(花生奶酪),而不是“pindaboter”(花生酱),因为“黄油”一词只用于含有实际黄油的产品

我想把
奶酪
黄油
之间的所有东西都搭配起来,反之亦然

目标:

  • 黄油被称为“花生奶酪”
  • 奶酪)而不是“品达博特”(花生酱)
编辑:
使用的语言是Python 3.7,当前使用的reg exp是
cheese(.*)butter

示例中的问题是,第一个目标的最后一个单词是源字符串中第二个目标的第一个单词;“normal”正则表达式语法使重新引擎使用它匹配的字符,即这些字符不可用于进一步的匹配

原则上,您可以使用类似于PCRE的正则表达式风格,在前瞻断言中使用捕获组,因为它们不会导致断言中的字符消耗。但是,所有这些断言在性能上都有其代价。匹配将在两个捕获组中进行。两个示例:

直线进近:

/
\b(?=(*?奶酪))黄油匹配黄油,断言奶酪紧跟其后并捕获
|#或
\b(?=(.*butter))奶酪匹配奶酪,断言黄油紧跟其后并捕获
/gsx标志:全局、单行、自由间距
让我们来看看
\b(?=(.*cheese))butter
的成功匹配是如何工作的;相同的原理也反映在另一个备选方案中。正则表达式引擎首先查找单词边界
\b
,即文本中两边都没有单词字符的位置。一旦找到,它将尝试断言
(?=(.*cheese))
在这个位置。用自然语言:“从这里开始,尽快找到
奶酪
。只有找到它,才能捕获刚刚在一个编号组中遍历的整个字符串,并将匹配指针返回到我们开始的位置。然后,允许匹配继续。”如果断言成功,匹配将继续,接下来将使用
butter
。我们有了匹配,匹配指针位于
butter
后面,正则表达式引擎将在文本的其余部分尝试相同的操作(当然包括替代方法)

稍微优化的版本:

/
\黄油
|
\奶酪
/gsx

输出:

Match 1
Full match  27-33   butter
Group 1.    27-70   butter is called "pindakaas" (peanut cheese

Match 2
Full match  64-70   cheese
Group 2.    64-111  cheese) rather than "pindaboter" (peanut butter

如果您不反对在事件发生后将匹配字符串和捕获的字符串连接到每个匹配中,那么这也会起作用,并且在性能方面会更好。(仍然可能不如Booboo的答案中所示的
重叠
解决方案好。)

/\bbutter\b.*\b(?=(奶酪))\b奶酪\b.*\b(?=(黄油))/sg
这只匹配每个选项,直到第二个术语之前的单词边界,这允许下一次匹配尝试以该术语开始。第二个术语不是匹配字符串的一部分,而是存储在捕获的组中:
['黄油被称为“pindakaas”(花生、奶酪)等。


请参阅。

示例中的问题是,第一个目标的最后一个字是源字符串中第二个目标的第一个字;“normal”RegEx语法使重新引擎使用它匹配的字符,即这些字符不能用于进一步的匹配

原则上,您可以使用类似于PCRE的正则表达式风格,在前瞻断言中使用捕获组,因为它们不会导致断言中的字符消耗。但是,所有这些断言在性能上都有其代价。匹配将在两个捕获组中进行。两个示例:

直线进近:

/
\b(?=(*?奶酪))黄油匹配黄油,断言奶酪紧跟其后并捕获
|#或
\b(?=(.*butter))奶酪匹配奶酪,断言黄油紧跟其后并捕获
/gsx标志:全局、单行、自由间距
让我们来看看
\b(?=(.*cheese))butter
的成功匹配是如何工作的;相同的原理也反映在另一个备选方案中。正则表达式引擎首先查找单词边界
\b
,即文本中两边都没有单词字符的位置。一旦找到,它将尝试断言
(?=(.*cheese))
在这个位置。用自然语言:“从这里开始,尽快找到
奶酪
。只有找到它,才能捕获刚刚在一个编号组中遍历的整个字符串,并将匹配指针返回到我们开始的位置。然后,允许匹配继续。”如果断言成功,匹配将继续,接下来将使用
butter
。我们有了匹配,匹配指针位于
butter
后面,正则表达式引擎将在文本的其余部分尝试相同的操作(当然包括替代方法)

稍微优化的版本:

/
\黄油
|
\奶酪
/gsx

输出:

Match 1
Full match  27-33   butter
Group 1.    27-70   butter is called "pindakaas" (peanut cheese

Match 2
Full match  64-70   cheese
Group 2.    64-111  cheese) rather than "pindaboter" (peanut butter

如果您不反对在事件发生后将匹配字符串和捕获的字符串连接到每个匹配中,那么这也会起作用,并且在性能方面会更好。(仍然可能不如Booboo的答案中所示的
重叠
解决方案好。)

/\bbutter\b.*\b(?=(奶酪))\b奶酪\b.*\b(?=(黄油))/sg
这只匹配每个选项,直到第二个术语之前的单词边界,这允许下一次匹配尝试以该术语开始。第二个术语不是匹配字符串的一部分,而是存储在捕获的组中:
['黄油被称为“pindakaas”(花生、奶酪)等。


如果安装
regex
pac,请参阅。

['butter is called "pindakaas" (peanut cheese', 'cheese) rather than "pindaboter" (peanut butter']