使用正则表达式检查连续重复的确切次数
Check for exact number of consecutive repetitions with a regex
仅使用正则表达式,如何匹配任意单个标记的准确连续重复次数?例如,匹配“ttaaabbb”中的“aaa”而不是“ttaaaabbb”中的“aaaa”,假设所需的重复次数为 3.
澄清:注意我使用“a”作为示例,标记可以是任意的character/number/symbols。也就是说,给定所需的重复次数为 3,“aaaa**!!!cccc333**”的所需匹配项仅给出“!!!”和“333”。
简而言之,我想找到给定字符串中出现YXXXY的标记“X”的列表(Y是一些不同于X的其他标记,Y也可以是字符串的开头或结尾的字符串)。请注意,列表中可以有重复的标记,例如,“aaabbbbaaa”应该给出 ["a", "a"].
其他一些示例:
输入:“aaabbbbbbaaa****ccc”,输出:[“a”,“a”,“ C”]
输入:“!!! aaaabbbaaa ccc!!!”,输出:[“!” , "b", "a", "c", "!".
我试过的:我试过(.){2}
但不幸的是,它在上面的例子中也匹配“aaaa”和“ccccc”。我进一步将其更改为 (?!)(.){2}(?!)
以便重复模式的前缀和后缀与其不同。但是,在这种情况下我得到了一个错误,因为第一个
在被引用时是未定义的。
您可以使用正则表达式和循环执行类似的操作:
def exact_re_match(string, length):
regex = re.compile(r'(.)*')
for match in regex.finditer(string):
elm = match.group()
if len(elm) == length:
yield elm
string = "aaaa!!!cccc333"
out = list(exact_re_match(string, 3))
print(out)
# ['!!!', '333']
您可以使用包含 2 个捕获组和重复反向引用的模式。
首先匹配 4 次或更多次您要避免的相同重复字符,然后匹配 3 次相同字符。
您想要的单个字符在捕获组 2 中,例如您可以使用 re.finditer 获取。
(\S){3,}|(\S){2}
模式匹配:
(\S){3,}
捕获组 1,匹配非空白字符并重复反向引用 3 次或更多次
|
或
(\S){2}
捕获组 2,匹配一个非空白字符并重复反向引用 2 次
例如:
import re
strings = [
"aaaa**!!!cccc333**",
"aaabbbbaaa",
"aaabbbbbbaaa****ccc",
"!!! aaaabbbaaa ccc!!!"
]
pattern = r"(\S){3,}|(\S){2}"
for s in strings:
matches = re.finditer(pattern, s)
result = []
for matchNum, match in enumerate(matches, start=1):
if match.group(2):
result.append(match.group(2))
print(result)
输出
['!', '3']
['a', 'a']
['a', 'a', 'c']
['!', 'b', 'a', 'c', '!']
仅使用正则表达式,如何匹配任意单个标记的准确连续重复次数?例如,匹配“ttaaabbb”中的“aaa”而不是“ttaaaabbb”中的“aaaa”,假设所需的重复次数为 3.
澄清:注意我使用“a”作为示例,标记可以是任意的character/number/symbols。也就是说,给定所需的重复次数为 3,“aaaa**!!!cccc333**”的所需匹配项仅给出“!!!”和“333”。
简而言之,我想找到给定字符串中出现YXXXY的标记“X”的列表(Y是一些不同于X的其他标记,Y也可以是字符串的开头或结尾的字符串)。请注意,列表中可以有重复的标记,例如,“aaabbbbaaa”应该给出 ["a", "a"].
其他一些示例:
输入:“aaabbbbbbaaa****ccc”,输出:[“a”,“a”,“ C”] 输入:“!!! aaaabbbaaa ccc!!!”,输出:[“!” , "b", "a", "c", "!".
我试过的:我试过(.){2}
但不幸的是,它在上面的例子中也匹配“aaaa”和“ccccc”。我进一步将其更改为 (?!)(.){2}(?!)
以便重复模式的前缀和后缀与其不同。但是,在这种情况下我得到了一个错误,因为第一个 在被引用时是未定义的。
您可以使用正则表达式和循环执行类似的操作:
def exact_re_match(string, length):
regex = re.compile(r'(.)*')
for match in regex.finditer(string):
elm = match.group()
if len(elm) == length:
yield elm
string = "aaaa!!!cccc333"
out = list(exact_re_match(string, 3))
print(out)
# ['!!!', '333']
您可以使用包含 2 个捕获组和重复反向引用的模式。
首先匹配 4 次或更多次您要避免的相同重复字符,然后匹配 3 次相同字符。
您想要的单个字符在捕获组 2 中,例如您可以使用 re.finditer 获取。
(\S){3,}|(\S){2}
模式匹配:
(\S){3,}
捕获组 1,匹配非空白字符并重复反向引用 3 次或更多次|
或(\S){2}
捕获组 2,匹配一个非空白字符并重复反向引用 2 次
例如:
import re
strings = [
"aaaa**!!!cccc333**",
"aaabbbbaaa",
"aaabbbbbbaaa****ccc",
"!!! aaaabbbaaa ccc!!!"
]
pattern = r"(\S){3,}|(\S){2}"
for s in strings:
matches = re.finditer(pattern, s)
result = []
for matchNum, match in enumerate(matches, start=1):
if match.group(2):
result.append(match.group(2))
print(result)
输出
['!', '3']
['a', 'a']
['a', 'a', 'c']
['!', 'b', 'a', 'c', '!']