我有一个包含数百万个字母的字符串(A 到 Z,没有空格和行结尾)。
我正在寻找以下类型的字母图案:
X.X.Y.YY
其中 X 和 Y 代表任何不同的字母和“.”。对于任何其他字母,但不包括 X 和 Y。
该模式是连续的八个字母系列,没有被其他字母序列“中断”。
例如“TBTZCFCC”满足该模式的条件,
“MSMQTXTT”也是如此。
但是例如“TBTZABDCFCC”不满足条件。
我想用正则表达式解决问题,但我是这个领域的外行。
到目前为止我已经:
([\s\S])(?!)[\s\S] ([\s\S])
正则表达式向我展示了以下示例:
TSPAUTDTRMQVNNSSAVUTAADSHEOUSVSROTBTZCFCCCPQATITOQOUNGDUPSILS
更正“TBTZCFCC”,
还有“TDTR”、“SVSR”和“TITO”,它们仅满足条件的第一部分。
我如何更改正则表达式才能找到满足帖子开头描述的条件“X.X.Y.YY”的八个连续字母?
预先感谢正则表达式专家提供的任何有用提示。
我多次改变正则表达式,但找不到解决方案!
我不会费心使用正则表达式。
这可能是线性时间算法。
我们可以定义什么是有效的,什么是无效的,并在 O(N) 时间内通过你的字符串运行一次。更容易维护和阅读
我不知道什么是无效的,但一般来说,可能是:
from collections import defaultdict
def sol(s):
def is_valid(i):
"""
X.X.Y.YY is valid
XAXBYCYY is valid
XXXBYCYY is not valid?
"""
for _ in range(8):
if s[i] != s[i + 2]:
return False
if s[i + 6] != s[i + 7]:
return False
if s[i + 4] != s[i + 6] or s[i + 4] != s[i + 7]:
return False
if s[i + 1] == s[i]:
return False
if s[i + 3] == s[i] or s[i + 3] == s[i + 4]:
return False
return True
d = defaultdict(list)
for j in range(len(s) - 7):
if is_valid(j):
match = s[j: j + 7]
d[match].append(j)
return sum(len(v) for v in d.values())
print(sol('TBTZCFCC'))
print(sol('TSPAUTDTRMQVNNSSAVUTAADSHEAOUSVSROTBTZCFCCCPQATITOQOUNGDUPSILS'))
print(sol('TSPAUTDTRMQVNNSSAVUTAADSHEAOUSVSROTBTZCFCCCPQATITOQOUNGDUPSILS' * 100000))