import re
SS = str(13**100500)
print(len(SS))
SUB = '637036977498347229246'
TEMPLATE = "63@036@7749@347@29@46"
time_start
= time.
monotonic()
result = SS.find(SUB)
time_end
= time.
monotonic()print(f"result: {result}, str search worktime: {1000 * (time_end - time_start):.3f}ms")
def check_pattern(s, template):
# first, split strings to lists of symbols
m = [*s]
t = [*template]
at = [index for index, symbol in enumerate(t) if symbol == '@']
for shift in range(len(m) - len(t) + 1):
sub_array = m[shift: shift + len(t)]
for at_index in at:
sub_array[at_index] = '@'
if sub_array == t:
return shift
return -1
def check_pattern_2(s, template):
# first, split strings to lists of symbols
m = [*s]
t = [*template]
MM = [(index, symbol) for index, symbol in enumerate(t) if symbol != '@']
for shift in range(len(m) - len(t) + 1):
t_pass = True
for kk, symbol in MM:
if m[shift + kk] != symbol:
t_pass = False
break
if t_pass:
return shift
return -1
def check_pattern_re(s, template):
res = re.findall(template.replace('@', '.'), s)
return s.find(res[0]) if res else -1
time_start
= time.
monotonic()result = check_pattern_2(SS, TEMPLATE)
time_end
= time.
monotonic()
worktime = 1000 * (time_end - time_start)
print(f"result: {result}, worktime: {worktime:.3f}ms")
aW1wb3J0IHJlCmltcG9ydCB0aW1lCgpTUyA9IHN0cigxMyoqMTAwNTAwKQpwcmludChsZW4oU1MpKQpTVUIgPSAnNjM3MDM2OTc3NDk4MzQ3MjI5MjQ2JwpURU1QTEFURSA9ICI2M0AwMzZANzc0OUAzNDdAMjlANDYiCgp0aW1lX3N0YXJ0ID0gdGltZS5tb25vdG9uaWMoKQoKcmVzdWx0ID0gU1MuZmluZChTVUIpCnRpbWVfZW5kID0gdGltZS5tb25vdG9uaWMoKQpwcmludChmInJlc3VsdDoge3Jlc3VsdH0sIHN0ciBzZWFyY2ggd29ya3RpbWU6IHsxMDAwICogKHRpbWVfZW5kIC0gdGltZV9zdGFydCk6LjNmfW1zIikKCmRlZiBjaGVja19wYXR0ZXJuKHMsIHRlbXBsYXRlKToKICAgICMgZmlyc3QsIHNwbGl0IHN0cmluZ3MgdG8gbGlzdHMgb2Ygc3ltYm9scwogICAgbSA9IFsqc10KICAgIHQgPSBbKnRlbXBsYXRlXQogICAgYXQgPSBbaW5kZXggZm9yIGluZGV4LCBzeW1ib2wgaW4gZW51bWVyYXRlKHQpIGlmIHN5bWJvbCA9PSAnQCddCiAgICBmb3Igc2hpZnQgaW4gcmFuZ2UobGVuKG0pIC0gbGVuKHQpICsgMSk6CiAgICAgICAgc3ViX2FycmF5ID0gbVtzaGlmdDogc2hpZnQgKyBsZW4odCldCiAgICAgICAgZm9yIGF0X2luZGV4IGluIGF0OgogICAgICAgICAgICBzdWJfYXJyYXlbYXRfaW5kZXhdID0gJ0AnCiAgICAgICAgaWYgc3ViX2FycmF5ID09IHQ6CiAgICAgICAgICAgIHJldHVybiBzaGlmdAogICAgcmV0dXJuIC0xCgpkZWYgY2hlY2tfcGF0dGVybl8yKHMsIHRlbXBsYXRlKToKICAgICMgZmlyc3QsIHNwbGl0IHN0cmluZ3MgdG8gbGlzdHMgb2Ygc3ltYm9scwogICAgbSA9IFsqc10KICAgIHQgPSBbKnRlbXBsYXRlXQogICAgTU0gPSBbKGluZGV4LCBzeW1ib2wpIGZvciBpbmRleCwgc3ltYm9sIGluIGVudW1lcmF0ZSh0KSBpZiBzeW1ib2wgIT0gJ0AnXQogICAgZm9yIHNoaWZ0IGluIHJhbmdlKGxlbihtKSAtIGxlbih0KSArIDEpOgogICAgICAgIHRfcGFzcyA9IFRydWUKICAgICAgICBmb3Iga2ssIHN5bWJvbCBpbiBNTToKICAgICAgICAgICAgaWYgbVtzaGlmdCArIGtrXSAhPSBzeW1ib2w6CiAgICAgICAgICAgICAgICB0X3Bhc3MgPSBGYWxzZQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiB0X3Bhc3M6CiAgICAgICAgICAgIHJldHVybiBzaGlmdAoKICAgIHJldHVybiAtMQoKZGVmIGNoZWNrX3BhdHRlcm5fcmUocywgdGVtcGxhdGUpOgogICAgcmVzID0gcmUuZmluZGFsbCh0ZW1wbGF0ZS5yZXBsYWNlKCdAJywgJy4nKSwgcykKICAgIHJldHVybiBzLmZpbmQocmVzWzBdKSBpZiByZXMgZWxzZSAtMQoKdGltZV9zdGFydCA9IHRpbWUubW9ub3RvbmljKCkKcmVzdWx0ID0gY2hlY2tfcGF0dGVybl8yKFNTLCBURU1QTEFURSkKdGltZV9lbmQgPSB0aW1lLm1vbm90b25pYygpCgp3b3JrdGltZSA9IDEwMDAgKiAodGltZV9lbmQgLSB0aW1lX3N0YXJ0KQpwcmludChmInJlc3VsdDoge3Jlc3VsdH0sIHdvcmt0aW1lOiB7d29ya3RpbWU6LjNmfW1zIikK