Speeding up and fixing phone numbers from CSVs with Regex
Use a compiled regular expression.

Since you are looking for the pattern anywhere within a string, use re.search() instead of re.match().  Actually, the behaviour is not exactly the same.  .search() will return the leftmost match, whereas .match() using your original pattern will return the rightmost match, since the initial .* is greedy.  The backtracking that is necessary to accomplish a rightmost match would be a source of inefficiency.

By using .search(), which performs a search not anchored to the start of the subject string, you can also eliminate the capturing parentheses and use .group(0) instead.

You can also shorten the regex by using \d (match any digit) and {n} (match the previous element n times).  Since your two regular expressions differ by only one character, combine them, using a [ -] character class to cover both cases.

In the canonicalization step, you want to eliminate all non-digits, so just do that instead.

regex = re.compile(r'\+?[2-9]?\d?\d?-?\(?\d{3}\)?[ -]?\d{3}-?\d{4})')
…

match = regex.search(s1)
if match:
    canonical_phone = re.sub(r'\D', '', match.group(0))
    if canonical_phone not in seen:
        seen.add(canonical_phone)
        output.append(canonical_phone)