字符串中字母模式的正则表达式

问题描述 投票:0回答:1

我有一个包含数百万个字母的字符串(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”的八个连续字母?

预先感谢正则表达式专家提供的任何有用提示。

我多次改变正则表达式,但找不到解决方案!

regex
1个回答
0
投票
  • 我不会费心使用正则表达式。

  • 这可能是线性时间算法。

  • 我们可以定义什么是有效的,什么是无效的,并在 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))

© www.soinside.com 2019 - 2024. All rights reserved.