自动创建字符串模式

create string pattern automatically

需要根据给定的模式创建字符串。

如果模式是222243243 需要创建的字符串是“2{4,6}[43]+2{1,3}[43]+”。 创建上述字符串的逻辑是,检查模式中有多少个 2 集并计算它们并添加更多两个 2。这里包含两组 2。第一个包含 4 个 2,第二个部分包含 1 个 2。所以第一个 2 可以是 4 到 6(4+2) 个 2,第二个 2 可以是 1 到 3(1+2)。当有3或4时,需要加上[43]+。

工作原理:

import re
data='222243243'
TwosStart=[]#contains twos start positions
TwosEnd=[]#contains twos end positions
TwoLength=[]#number of 2's sets

for match in re.finditer('2+', data):
    s = match.start()#2's start position
    e = match.end()#2's end position
    d=e-s
    print(s,e,d)
    TwosStart.append(s)
    TwosEnd.append(e)
    TwoLength.append(d)

所以使用上面的代码我知道在给定的模式中有多少个 2 的集合以及它们的开始和结束位置。但我不知道如何使用上述信息自动创建一个字符串。

例如:

if pattern '222243243' string should be "2{4,6}[43]+2{1,3}[43]+"

if pattern '222432243' string should be "2{3,5}[43]+2{2,4}[43]+"

if pattern '22432432243' string should be "2{2,4}[43]+2{1,3}[43]+2{2,4}[43]+"

一种方法是使用 itertools.groupby:

from itertools import groupby

s = "222243243"

result = []
for key, group in groupby(s, key=lambda c: c == "2"):
    if key:
        size = (sum(1 for _ in group))
        result.append(f"2{{{size},{size+2}}}")
    else:
        result.append("[43]+")

pattern = "".join(result)
print(pattern)

输出

2{4,6}[43]+2{1,3}[43]+

使用您的基本代码:

import re
data='222243243'
cpy=data
offset=0 # each 'cpy' modification offsets the addition

for match in re.finditer('2+', data):
    s = match.start() # 2's start position
    e = match.end() # 2's end position
    d = e-s
    regex = "]+2{" + str(d) + "," + str(d+2) + "}["
    cpy = cpy[:s+offset] + regex + cpy[e+offset:]
    offset+=len(regex)-d

# sometimes the borders can have wrong characters
if cpy[0]==']':
        cpy=cpy[2:] # remove "]+"
else:
        cpy='['+cpy

if cpy[len(cpy)-1]=='[':
        cpy=cpy[:-1]
else:
        cpy+="]+"

print(cpy)

输出

2{4,6}[43]+2{1,3}[43]+