通过替换通配符生成多个字符串

Generating multiple strings by replacing wildcards

所以我有以下字符串:

"xxxxxxx#FUS#xxxxxxxx#ACS#xxxxx"
"xxxxx#3#xxxxxx#FUS#xxxxx"

我想从这个模式生成以下字符串(我将使用第二个示例): 考虑到#FUS# 将代表 2.

"xxxxx0xxxxxx0xxxxx"  
"xxxxx0xxxxxx1xxxxx"    
"xxxxx0xxxxxx2xxxxx"

"xxxxx1xxxxxx0xxxxx"  
"xxxxx1xxxxxx1xxxxx"    
"xxxxx1xxxxxx2xxxxx"

"xxxxx2xxxxxx0xxxxx"  
"xxxxx2xxxxxx1xxxxx"    
"xxxxx2xxxxxx2xxxxx"

"xxxxx3xxxxxx0xxxxx"  
"xxxxx3xxxxxx1xxxxx"    
"xxxxx3xxxxxx2xxxxx"

基本上,如果我得到一个如上所述的字符串,我想通过替换可以是#FUS#、#WHATEVER#或数字#20#的通配符来生成多个字符串,并生成具有范围的多个字符串这些通配符代表。

我已经设法得到一个正则表达式来查找通配符。

wildcardRegex = f"(#FUS#|#WHATEVER#|#([0-9]|[1-9][0-9]|[1-9][0-9][0-9])#)"

正确找到目标通配符。

对于 1 个通配符,这很容易。

re.sub()

越多越复杂。或者也许这是漫长的一天...

但我认为我的算法逻辑严重失败,因为我未能编写一些基本上会生成信号的代码。我想我需要某种递归函数,该函数将为存在的每个通配符数量调用(最多可能存在 4 个(xxxxx#2#xxx#2#xx#FUS#xx#2#x))。

我需要一个结果信号列表。

有什么我完全想念的简单方法吗?

谢谢。

import re

stringV1 = "xxx#FUS#xxxxi#3#xxx#5#xx"
stringV2 = "XXXXXXXXXX#FUS#XXXXXXXXXX#3#xxxxxx#5#xxxx"

regex = "(#FUS#|#DSP#|#([0-9]|[1-9][0-9]|[1-9][0-9][0-9])#)"

WILDCARD_FUS = "#FUS#"
RANGE_FUS = 3

def getSignalsFromWildcards(app, can):
    sigList = list()
    if WILDCARD_FUS in app:
        for i in range(RANGE_FUS):
            outAppSig = app.replace(WILDCARD_FUS, str(i), 1)
            outCanSig = can.replace(WILDCARD_FUS, str(i), 1)
            if "#" in outAppSig:
                newSigList = getSignalsFromWildcards(outAppSig, outCanSig)
                sigList += newSigList
            else:
                sigList.append((outAppSig, outCanSig))

    elif len(re.findall("(#([0-9]|[1-9][0-9]|[1-9][0-9][0-9])#)", stringV1)) > 0:
        wildcard = re.search("(#([0-9]|[1-9][0-9]|[1-9][0-9][0-9])#)", app).group()
        tarRange = int(wildcard.strip("#"))
        for i in range(tarRange):
            outAppSig = app.replace(wildcard, str(i), 1)
            outCanSig = can.replace(wildcard, str(i), 1)
            if "#" in outAppSig:
                newSigList = getSignalsFromWildcards(outAppSig, outCanSig)
                sigList += newSigList
            else:
                sigList.append((outAppSig, outCanSig))
    return sigList

if "#" in stringV1:
    resultList = getSignalsFromWildcards(stringV1, stringV2)

for item in resultList:
    print(item)

结果

('xxx0xxxxi0xxxxx', 'XXXXXXXXXX0XXXXXXXXXX0xxxxxxxxxx')
('xxx0xxxxi1xxxxx', 'XXXXXXXXXX0XXXXXXXXXX1xxxxxxxxxx')
('xxx0xxxxi2xxxxx', 'XXXXXXXXXX0XXXXXXXXXX2xxxxxxxxxx')
('xxx1xxxxi0xxxxx', 'XXXXXXXXXX1XXXXXXXXXX0xxxxxxxxxx')
('xxx1xxxxi1xxxxx', 'XXXXXXXXXX1XXXXXXXXXX1xxxxxxxxxx')
('xxx1xxxxi2xxxxx', 'XXXXXXXXXX1XXXXXXXXXX2xxxxxxxxxx')
('xxx2xxxxi0xxxxx', 'XXXXXXXXXX2XXXXXXXXXX0xxxxxxxxxx')
('xxx2xxxxi1xxxxx', 'XXXXXXXXXX2XXXXXXXXXX1xxxxxxxxxx')
('xxx2xxxxi2xxxxx', 'XXXXXXXXXX2XXXXXXXXXX2xxxxxxxxxx')

漫长的一天after-all...