如果任何模式在给定序列中多次出现一次,如何使用正则表达式进行匹配
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+ 次,直到字符串结束
如果有选项,您可以使用 Negative lookahead。
首先匹配你想要失败的句子,在你的情况下,它是"THE TREE IS GREEN"然后给出最通用的情况,想要捕捉你想要的结果。
(?!THE TREE IS GREEN)(THE[ ]+TREE[ ]+IS[ ]+GREEN)
你可以这样做:
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()))
很难说清楚,但是 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+ 次,直到字符串结束
如果有选项,您可以使用 Negative lookahead。
首先匹配你想要失败的句子,在你的情况下,它是"THE TREE IS GREEN"然后给出最通用的情况,想要捕捉你想要的结果。
(?!THE TREE IS GREEN)(THE[ ]+TREE[ ]+IS[ ]+GREEN)
你可以这样做:
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()))