0
import re
s =  'nums here (111)123-4567 or (1-800-111-2222)(123)1234567 or 321-123-4567 or ( 112)123-4567 or (113 )123-4567'

My goal is to get all phone numbers from s.

From selecting variations of phone numbers using regex I try the following:

reg = r'\d{3}-\d{3}-\d{4}|\(\s*\d{3}\s*\)\d{7}|\(\s*\d{3}\s*\)\s*\d{3}-\d{4}' 
r1 = re.findall(reg,s)
r1

Which gives me close to what I want

['(111)123-4567',
 '800-111-2222',
 '(123)1234567',
 '321-123-4567',
 '( 112)123-4567',
 '(113 )123-4567']

However, I would like (1-800-111-2222) instead of the partial 800-111-2222

My desired output is the following

 ['(111)123-4567',
     '(1-800-111-2222)',
     '(123)1234567',
     '321-123-4567',
     '( 112)123-4567',
     '(113 )123-4567']

How do I alter

reg = r'\d{3}-\d{3}-\d{4}|\(\s*\d{3}\s*\)\d{7}|\(\s*\d{3}\s*\)\s*\d{3}-\d{4}'

to get my desired output?

ChiBay
  • 219
  • 1
  • 6

2 Answers2

1
import re
s =  'nums here (111)123-4567 or (1-800-111-2222)(123)1234567 or 321-123-4567 or ( 112)123-4567 or (113 )123-4567'

reg="\(\d{3}\)\d{3}-\d{4}|\(\d{1}-\d{3}-\d{3}-\d{4}\)|\(\d{3}\)\d{7}|\d{3}-\d{3}-\d{4}|\(\s+\d{3}\)\d{3}-\d{4}|\(\d{3}\s+\)\d{3}-\d{4}"

r1 = re.findall(reg,s)
r1


Running above, outputs:

['(111)123-4567',
 '(1-800-111-2222)',
 '(123)1234567',
 '321-123-4567',
 '( 112)123-4567',
 '(113 )123-4567']
1

This seems to work:

\(?\s*\d?\s*-?\d{3}\s*[)-]?\s*\d{3}\s*-?\s*\d{4}\)?

https://regex101.com/r/tc9E1E/1

MonkeyZeus
  • 18,445
  • 3
  • 30
  • 67