如果任何模式在给定序列中多次出现一次,如何使用正则表达式进行匹配

How to use a regex to match if any pattern appears once out of many times in a given sequence

很难说清楚,但是 TL;DR.

我想匹配,在给定的文本句子中(比方说 "THE TREE IS GREEN"),如果 any space 加倍(或更多)。

示例:

"In this text,
THE TREE IS GREEN should not match,
THE  TREE IS GREEN should
and so should THE  TREE   IS GREEN
but  double-spaced  TEXT  SHOULD  NOT BE  FLAGGED outside the pattern."

我最初的做法是

/THE( {2,})TREE( {2,})IS( {2,})GREEN/

但这仅在序列中所有 space 都是双倍时才匹配,因此我想让任何组触发完全匹配。我是走错路了,还是有什么方法可以让它发挥作用?

您可以只搜索您要查找的 space:

/ {2,}/ 将匹配两个或多个 space 字符。 (https://regexr.com/4h4d4)

您可以将结果用括号括起来 - /( {2,})/

你可能想把它放宽一点。
/\s{2,}/ 将匹配白色的任何加倍 space。 (\s - 表示任何白色 space - space、制表符、换行符等)

无需匹配整个字符串,只需匹配感兴趣的部分即可。

如果我没记错的话,如果在 2 个大写部分之间有 2 个或更多 space 的部分存在,那么您需要整个匹配项。

如果是这样,您可以使用:

^.*[A-Z]+ {2,}[A-Z]+.*$
  • ^ 字符串开头
  • .*[A-Z]+ 匹配除换行符以外的任何字符 0+ 次,然后匹配 1+ 次 [A-Z]
  • [ ]{2,} 匹配 2 次或更多次 space(为清楚起见,使用方括号)
  • A-Z+ 匹配 1+ 次大写字符
  • .*$ 匹配除换行符之外的任何字符 0+ 次,直到字符串结束

Regex demo

如果有选项,您可以使用 Negative lookahead。

首先匹配你想要失败的句子,在你的情况下,它是"THE TREE IS GREEN"然后给出最通用的情况,想要捕捉你想要的结果。

(?!THE TREE IS GREEN)(THE[ ]+TREE[ ]+IS[ ]+GREEN)

https://regex101.com/r/EYDU6g/2

你可以这样做:

import re

pattern = r"THE +TREE +IS +GREEN"

test_str = ("In this text,\n"
    "THE TREE IS GREEN should not match,\n"
    "THE  TREE IS GREEN should\n"
    "and so should THE TREE   IS GREEN\n"
    "but  double-spaced  TEXT  SHOULD  NOT BE  FLAGGED outside the pattern.")

matches = re.finditer(pattern, test_str, re.MULTILINE)

for matchNum, match in enumerate(matches, start=1):
    if match.group() != 'THE TREE IS GREEN':
        print ("{match}".format(match = match.group()))