import re
versions = [
#production .net core standards
"3.9.1.0+3f8b21d3a442bb4371e73e5c78f00191f437ab92.0!",
#old pipeline model
"3.9.0.113.1",
#pipeline model
"3.10.0.27.9ec628f87baab65d7b0a809ce3ac6ca4749b7b77"
]
stringPattern= r"^(\d+\.\d+\.\d+\.\d+)"
pattern = re.compile(stringPattern)
print("===================example 1===============================")
for version in versions:
result = pattern.match(version)
if result:
print(result.group(1))
print("===================example 2===============================")
for version in versions:
result = re.search(pattern, version)
print(result.group())
print("=================== Option 3 ===============================")
extracted_versions = [
match.group(1)
for version in versions
for match in [re.search(r"^(\d+\.\d+\.\d+\.\d+)", version)]
if match
]
for version in extracted_versions:
print(version)
print("=================== Option 4 ===============================")
for version in versions:
matches = re.findall(r"^(\d+\.\d+\.\d+\.\d+)", version)
if matches:
print(matches[0])
print("=================== Option 5 ===============================")
for version in versions:
for match in re.finditer(r"^(\d+\.\d+\.\d+\.\d+)", version):
print(match.group(1))
print("=================== Option 6 ===============================")
def extract_version(version_str, pattern):
match = pattern.match(version_str)
return match.group(1) if match else None
# Use map to apply the function to each version, then filter out None results.
extracted = filter(None, map(lambda v: extract_version(v, pattern), versions))
for version in extracted:
print(version)
aW1wb3J0IHJlCgp2ZXJzaW9ucyA9IFsKCSNwcm9kdWN0aW9uIC5uZXQgY29yZSBzdGFuZGFyZHMKCSIzLjkuMS4wKzNmOGIyMWQzYTQ0MmJiNDM3MWU3M2U1Yzc4ZjAwMTkxZjQzN2FiOTIuMCEiLAoJCgkjb2xkIHBpcGVsaW5lIG1vZGVsCgkiMy45LjAuMTEzLjEiLAoJCgkjcGlwZWxpbmUgbW9kZWwKCSIzLjEwLjAuMjcuOWVjNjI4Zjg3YmFhYjY1ZDdiMGE4MDljZTNhYzZjYTQ3NDliN2I3NyIKXQoKc3RyaW5nUGF0dGVybj0gciJeKFxkK1wuXGQrXC5cZCtcLlxkKykiCnBhdHRlcm4gPSByZS5jb21waWxlKHN0cmluZ1BhdHRlcm4pCnByaW50KCI9PT09PT09PT09PT09PT09PT09ZXhhbXBsZSAxPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpCmZvciB2ZXJzaW9uIGluIHZlcnNpb25zOgogICAgcmVzdWx0ID0gcGF0dGVybi5tYXRjaCh2ZXJzaW9uKQogICAgaWYgcmVzdWx0OgogICAgICAgIHByaW50KHJlc3VsdC5ncm91cCgxKSkKICAgICAgICAKICAgICAgICAKcHJpbnQoIj09PT09PT09PT09PT09PT09PT1leGFtcGxlIDI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IikKZm9yIHZlcnNpb24gaW4gdmVyc2lvbnM6CiAgICByZXN1bHQgPSByZS5zZWFyY2gocGF0dGVybiwgdmVyc2lvbikKICAgIHByaW50KHJlc3VsdC5ncm91cCgpKQoKcHJpbnQoIj09PT09PT09PT09PT09PT09PT0gT3B0aW9uIDMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpCmV4dHJhY3RlZF92ZXJzaW9ucyA9IFsKICAgIG1hdGNoLmdyb3VwKDEpCiAgICBmb3IgdmVyc2lvbiBpbiB2ZXJzaW9ucwogICAgZm9yIG1hdGNoIGluIFtyZS5zZWFyY2gociJeKFxkK1wuXGQrXC5cZCtcLlxkKykiLCB2ZXJzaW9uKV0KICAgIGlmIG1hdGNoCl0KCmZvciB2ZXJzaW9uIGluIGV4dHJhY3RlZF92ZXJzaW9uczoKICAgIHByaW50KHZlcnNpb24pCiAgICAKcHJpbnQoIj09PT09PT09PT09PT09PT09PT0gT3B0aW9uIDQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpCmZvciB2ZXJzaW9uIGluIHZlcnNpb25zOgogICAgbWF0Y2hlcyA9IHJlLmZpbmRhbGwociJeKFxkK1wuXGQrXC5cZCtcLlxkKykiLCB2ZXJzaW9uKQogICAgaWYgbWF0Y2hlczoKICAgICAgICBwcmludChtYXRjaGVzWzBdKSAgIAogICAgICAgIAogICAgICAgIApwcmludCgiPT09PT09PT09PT09PT09PT09PSBPcHRpb24gNSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IikKZm9yIHZlcnNpb24gaW4gdmVyc2lvbnM6CiAgICBmb3IgbWF0Y2ggaW4gcmUuZmluZGl0ZXIociJeKFxkK1wuXGQrXC5cZCtcLlxkKykiLCB2ZXJzaW9uKToKICAgICAgICBwcmludChtYXRjaC5ncm91cCgxKSkKICAgICAgICAKICAgICAgICAKCgpwcmludCgiPT09PT09PT09PT09PT09PT09PSBPcHRpb24gNiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IikKZGVmIGV4dHJhY3RfdmVyc2lvbih2ZXJzaW9uX3N0ciwgcGF0dGVybik6CiAgICBtYXRjaCA9IHBhdHRlcm4ubWF0Y2godmVyc2lvbl9zdHIpCiAgICByZXR1cm4gbWF0Y2guZ3JvdXAoMSkgaWYgbWF0Y2ggZWxzZSBOb25lCiMgVXNlIG1hcCB0byBhcHBseSB0aGUgZnVuY3Rpb24gdG8gZWFjaCB2ZXJzaW9uLCB0aGVuIGZpbHRlciBvdXQgTm9uZSByZXN1bHRzLgpleHRyYWN0ZWQgPSBmaWx0ZXIoTm9uZSwgbWFwKGxhbWJkYSB2OiBleHRyYWN0X3ZlcnNpb24odiwgcGF0dGVybiksIHZlcnNpb25zKSkKZm9yIHZlcnNpb24gaW4gZXh0cmFjdGVkOgogICAgcHJpbnQodmVyc2lvbikK