寻找匹配最长重复GGG序列的正则表达式(间隔≤10字符)
解决最长GGG重复序列匹配问题
Hey there! Let's fix that regex issue you're having. Your original pattern ((GGG).{0,10}?)* isn't working well for two key reasons:
- The non-greedy quantifier
.{0,10}?tries to match as few characters as possible, so it often stops early instead of capturing the longest continuous sequence of GGGs with valid gaps. - It doesn't anchor to a valid continuous range, so it can match scattered GGGs or even empty strings when no GGGs are present.
Correct Regex Pattern
To capture sequences where every pair of GGGs is separated by 0 to 10 "interrupt" characters, use this greedy, focused pattern:
(GGG(?:.{0,10}GGG)*)
Breakdown of the pattern:
GGG: Starts the match with a valid GGG sequence(?:.{0,10}GGG)*: A non-capturing group that repeats any number of times:.{0,10}: Matches 0 to 10 interrupt characters (including zero, so consecutive GGGs likeGGGGare allowed)GGG: Matches the next valid GGG sequence- The
*is greedy, so it will keep matching as many valid GGG pairs as possible to get the longest possible sequence
- The outer parentheses capture the entire valid sequence for later use
How to Find the Longest Matching Segment
Regex engines will return all valid matches, but we need to pick the longest one. Here's a Python example to do that:
import re target_str = "CAGTTAGGGTTTAGGGTTAGGTTTAGGGTTAGGGTTAGGGTGAGGTGAGGGTGAGGGTTAGGGTGAGGGGTGAGGGGTTGGGGTTAGGGTTAGGGTTAGGAGTTGCAGGGGTTAGGGTTAGGGTTAGGGGTTAGGGTTAGGGTTAGGGGTTAGGGTTACTTTAGGGTTAGGGTTGGGGGTTTAGGGTTTAGGGTTTAGGGTTTAGGGTTTAGGGTTAGAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTACCTGCTTACTTGCTGCAGGGTTAGGGTTAGGGTTAGGGTTAAGTTAGGGTTTAGGGTTGGGGTTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTGGGTTAGGGTTAGGGTTAGGGTTAGGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTGGGGTTAGGGTTAGGGTTAGGGTTAGGGTTGAGGTTAGGGTTAGGTTAGGGTTAGGGTTAGGGTTAGGGGTTAGGGTTAGGGTTAGGGTTAGGGTTGCAGGGTTAGGGTTGGGGTTAGGGGTTAGGGGTTGGGGGGGTTAGGGTTGGGGGTTGGGGGTTAGGGAGGGTTAGGGGTTGGGGGTTGCAGGGGTTAGGGTTAGGGGTTGGGGTTAGGGTTAGGGTTAGGGTTACCTTGGGGGTTGGGGTTAGGGTTAGGGTTGCAGGGTTAGGGTTAGGAGTTAGGGTTAGAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTTAGGGTTAGGGTTGGGGTTAGGGTTAGAGGTTAGGGTTAGGGGTTGGGGTTAGGGGTTGGGGGTTGGGGTTAGGGTTGCAGAAGGGGTTGAGCAGGGTGGGAGTTAGGGATTAGGGATTAGGAGTTAGGGTGAGGGTTAGGGTTAGGGTGGGGTGGGGATTGGGGATTGGGAGTTAGGGTGGGTGGGGATTGGGGAGTTAGGAGTTAGGAGTTAGGAGTTAGGGAGTTAGGTTAGGGAGTTAGGGTTAGGAGTTAGAGGTTAGGGTTAGGGTGGGAGTTAGGGAGTTAGGAGGTGGGGTTGGGGTTAGGGTTAGGAGTTAGGGTTAGGGTTAGGGTTAGGGATTGGGAGTTAGGGTAGGAGTTAGGGTTAGAGGTTAGGAGTTAGGGTTAGGAGTTAGGGATTAGAGGTTAGGGTGGGATTAGGAGTTACTTACTTAGGGAGTTAGGAGTTAGGAGTTAGGGTGGGGTGGGAGTTAGAGGTTAGGAGTTAGGAGTTAGGGTTAGGGTTAGGAGTTAAGGGTTAGGGATTAGGAGTTAGGGTTAGGGTTAGGAGTTAGGGAGTTAGGGTGGGGTGGGAGTTGCAGGGATTGGGTTAGGGTTAGGAGTTGGGAGTTGGGGAGTTGGGAGTTAGGGTTACAGGGTGGGAGTTAGGAGTTAGGGAGTTAGGAGTTAGAGGTTAGGGATTAGGGGT" # Find all valid sequences matches = re.findall(r'(GGG(?:.{0,10}GGG)*)', target_str) # Pick the longest match if matches: longest_match = max(matches, key=lambda x: len(x)) print(f"Longest valid segment: {longest_match}") print(f"Length: {len(longest_match)}") print(f"Number of GGG sequences: {longest_match.count('GGG')}") else: print("No valid GGG sequences found.")
Extra Notes
- If you want to include overlapping GGG matches (like counting
GGGGas two overlapping GGG sequences), use a positive lookahead pattern to capture all possible overlapping segments:
Then you can still filter the results to find the longest one.(?=(GGG(?:.{0,10}GGG)*)) - This logic works in other languages too—just find all matches, then sort or filter by length to get the longest valid segment.
内容的提问来源于stack exchange,提问作者Lior Paz
相关产品推荐
相关产品推荐

