我想创建一个简单的字符串生成器,这是它的工作原理
pattern_string = "abcdefghijklmnopqrstuvwxyz"
starting_string = "qywtx"
starting_string
根据模式字符串检查 my中的最后一个字符。最后一个字符是x
。我们在 find it in 中找到这个字符pattern_string
:
abcdefghijklmnopqrstuvw x yz
并看到下一个字符是y
我想要的输出qywty
。...
然而,当我到达Z,我想我的字符串来增加倒数第二个字符和最后一个字符集的第一个字符starting_pattern
所以这将是qywra
等等...
现在提问:
我可以使用 REGEX 来实现吗?
有没有已经处理过这种生成的库?
以下将根据您的描述生成下一个字符串。
def next(s, pat):
l = len(s)
for i in range(len(s) - 1, -1, -1): # find the first non-'z' from the back
if s[i] != pat[-1]: # if you find it
# leave everything before i as is, increment at i, reset rest to all 'a's
return s[:i] + pat[pat.index(s[i]) + 1] + (l - i - 1) * pat[0]
else: # this is only reached for s == 'zzzzz'
return (l + 1) * pat[0] # and generates 'aaaaaa' (just my assumption)
>>> import string
>>> pattern = string.ascii_lowercase # 'abcde...xyz'
>>> s = 'qywtx'
>>> s = next(s, pattern) # 'qywty'
>>> s = next(s, pattern) # 'qywtz'
>>> s = next(s, pattern) # 'qywua'
>>> s = next(s, pattern) # 'qywub'
对于多个'z'
到底:
>>> s = 'foozz'
>>> s = next(s, lower) # 'fopaa'
对于所有 'z',从增加长度的 'a' 开始:
>>> s = 'zzz'
>>> s = next(s, lower) # 'aaaa'
据我所知,没有库函数可以做到这一点。一个接近的是itertools.product
:
>>> from itertools import product
>>> list(map(''.join, product('abc', repeat=3)))
['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 'acc', 'baa',
'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 'bcb', 'bcc', 'caa', 'cab',
'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc']
但这不适用于任意起始字符串。这种行为可以通过将其与组合来模仿,itertools.dropwhile
但是在开始字符串之前跳过所有组合会产生严重的开销(在字母表为 26 的情况下和接近末尾的开始字符串几乎使该方法无用):
>>> list(dropwhile(lambda s: s != 'bba', map(''.join, product('abc', repeat=3))))
['bba', 'bbb', 'bbc', 'bca', 'bcb', 'bcc', 'caa', 'cab', 'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc']
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句