Sean
Sean

Reputation: 631

Integrating Wildcard In Comparison of Strings

I have a python script which takes a name, re-formats it, and then compares it to a list of other names to see how many times it matches. The issue is the names it is being compared to have middle initials (which I don't want to have entered in the script).

 list_of_names = ['Doe JM', 'Cruz CR', 'Smith JR', 'Doe JM', 'Maltese FL', 'Doe J']

Now I have a simple function that reformats the name.

f_name = name_format('John','Doe')
print(f_name)

> 'Doe J'

Now I want to do comparisons where everytime "Doe J" or "Doe JM" appears, the value is true. The below function would not work as intended.

def matches(name, list):
    count = 0
    for i in list:
        if i == name:
           count = count + 1
        else:
           pass
     return(count)

print (matches(f_name, list_of_names))

> 1

My goal is to make the return equal to 3. To do these, I want ignore the middle initial which in this case would be 'M' in 'Doe JM'.

What I want to do is something along the lines of formatting the name to 'Doe J?' where '?' is a wild card. I tried importing fnmatch and re to use some of their tools but was unsuccessful.

Upvotes: 1

Views: 60

Answers (2)

Marc J
Marc J

Reputation: 1433

You were on the right track with the re module. I believe the solution to your problem would be:

import re
def matches(name, name_list):
    regex = name + '\w?' # Allows one addition word character after the name
    result = list(map(lambda test_name: re.match(regex, test_name) is not None, name_list))
    return result.count(True)

print(matches(f_name, list_of_names))
# 3

This solution ensures that exactly one alphanumeric character is allowed after the name.

Upvotes: 0

JRazor
JRazor

Reputation: 2817

Use two for and yield. Function will return duplicate values and you need use set for remove it:

list_of_names = ['Doe JM', 'Cruz CR', 'Smith JR', 'Doe JM', 'Maltese FL', 'Doe J']

# List of names
def check_names(part_names, full_name_list):
    for full_name in full_name_list:
        for part_name in part_names:
            if part_name in full_name:
                yield full_name

result = set(check_names(['Doe J', 'Cruz'], list_of_names))

# One name 
def check_names(name, full_name_list):
    for full_name in full_name_list:
        if name in full_name:
            yield full_name

result = check_names('Doe J', list_of_names)

print list(result)  # List of result
print len(result)  # Count of names

Upvotes: 1

Related Questions