abhinav singh
abhinav singh

Reputation: 1104

Excluding a string name when it partially matches with any element of a list

I am using Python3 to read AWS bucket names and specifically exit from the loop if the bucket name matches partially with any of the names defined in the bucket_exclusion_list array.

I created a bucket validation function as follows:

def valid_bucket(bucket_name):
    bucket_exclusion_list = ['do-not-delete', 'aws-config', 'elasticbeanstalk']
    for exclusion_items in bucket_exclusion_list:
        if bool(re.match(exclusion_items, bucket_name)) == True:
            return False
        else:
            continue
    return True

In my main function, I am calling the valid_bucket function and based on the boolean value, continuing further in the code.

if valid_bucket(bucket_name):
   bucket_info["bucketName"] = bucket_name
   bucket_info["bucketSize"] = ''
   ...

The code doesn't seem to be working as expected. I have to move on to the next bucket name if the current bucket name matches with the items in the exclusion list. Can someone help me understand the problem with the code?

Upvotes: 1

Views: 59

Answers (2)

Bhagyesh Dudhediya
Bhagyesh Dudhediya

Reputation: 1864

Just change your function as below:

import re
def valid_bucket(bucket_name):
    bucket_exclusion_list = ['do-not-delete', 'aws-config', 'elasticbeanstalk']
    regex = "|".join(bucket_exclusion_list)
    if re.search(rf'{regex}', bucket_name):
        return True
    return False

if (valid_bucket(bucket_name)):
    print ("VALID")
else:
    print ("INVALID")

Output with bucket name = my-bucket

INVALID

Output with bucket name = do-not-delete my-bucket

VALID

Upvotes: 0

Selcuk
Selcuk

Reputation: 59444

re.match will only match the beginning of the string. You can use in instead of a regex:

if exclusion_items in bucket_name:
    return False
else:
    continue

That being said, this function can be rewritten as:

def valid_bucket(bucket_name):
    bucket_exclusion_list = ['do-not-delete', 'aws-config', 'elasticbeanstalk']
    return all(item not in bucket_name for item in bucket_exclusion_list)

Upvotes: 1

Related Questions