Search code examples
pythonregex-group

Issue Validating more than one pattern of regex in Python


I am having issues with regex and re.search method. The expected result is validation for both phone numbers and emails. I can validate for phone numbers or emails, but when I want to do both, I only get phone numbers being recognized.

I tried separating them into different functions and only when commenting out phone number function would email addressed be recognized.

#!/usr/bin/env python3
'''regex program for retrieving phone numbers & emails from a list,
this will use 2 regex patterns. One for phone numbers & one for emails'''
import re
import sys


if len(sys.argv) < 2:
    sys.exit("Usage: run as follows: extractor.py [phone number or email address]")

string = ' '.join(sys.argv[1:])

PHONE_NUMBER = re.compile(r"""(
    (\(\d{3}\))?|(\d{3})    # area code check
    (\d{3})                 # First 3 digits
    (\s|-|\.)               # Hyphen
    (\d{4})                 # Last 4 digits
    )""", re.VERBOSE)       # Verbose method
# \d{3}\)\d{3}-\d{4}'))

EMAIL = re.compile(r"""(
    [a-zA-Z0-9._%&+-]+      # email userid
    @                       # @ sign for email domain
    [a-zA-Z0-9.-]+          # domain
    (\.[a-zA-Z0-9]{2,3})    # dot.com/etc, a range of 2-3
    )""", re.VERBOSE)


def phone_num_email():
    '''phone numbers or email addresses'''
    if(re.search(PHONE_NUMBER, string)):
        print("Found a match for a phone number")
    elif re.search(EMAIL, string):
        print("Found a match for email address")
    else:
        print("No matches found for a phone number or email address")


# TODO:
# recognized email, still has blank acceptance of phone numbers


if __name__ == '__main__':
    phone_num_email()

Solution

  • You are utilising your if statements incorrectly to achieve the desired result.

    if(re.search(PHONE_NUMBER, string)):
            print("Found a match for a phone number")
    elif re.search(EMAIL, string):
            print("Found a match for email address")
    

    You're saying you only want to search for an email, if a phone number is not found. This is due to else if. In the case of searching for both, you do not want to use an else statement as it will ignore the email if a phone number match is found.

    Change it to:

    if re.search(PHONE_NUMBER, string):
            print("Found a match for a phone number")
    if re.search(EMAIL, string):
            print("Found a match for email address")
    else:
            print("No matches found for a phone number or email address")