Phone numbers are wildly variable
US: (415) 555-0199, 415-555-0199, 415.555.0199, +1 415 555 0199. Korea: 010-1234-5678, 02-1234-5678. UK: +44 7700 900123. Every country has variants.
The shape-loose pattern
For finding phone-like things in text:
\+?\d[\d\s().-]{7,}\d
Optional plus, digit, then 7+ characters of digits/spaces/parens/dots/dashes, ending in a digit.
US-specific validation
^(?:\+1\s*)?(?:\(\d{3}\)|\d{3})[\s.-]?\d{3}[\s.-]?\d{4}$
Optional +1, area code (parens or bare), separator, exchange, separator, line number.
For real validation: libphonenumber
Google's libphonenumber handles every country, format variant, and validation rule. Bindings exist for Python (phonenumbers), JS, Java, etc. If your app accepts international phone numbers, use it. Regex won't get you there.
The simplest pattern that's useful
If you just want "contains 10+ digits in a phone-shaped layout," the loose pattern above is fine for free-form text extraction. Validation requires either country-specific patterns OR libphonenumber.