I can recommend the following options:
1) I would embed query parameters directly in the query, I would pass then separately as a tuple/dict to the cursor.execute (see your db api for exact formatting) method:
app_phone = 5555555555
query_string="""SELECT biz_name, biz_addr, biz_owner
FROM business_t
WHERE regexp_replace(biz_phone_1, E'\\\\D|^1', '', 'g') = '%(phone)s'
OR regexp_replace(biz_phone_2, E'\\\\D|^1', '', 'g') = '%(phone)s'
OR regexp_replace(biz_cell_1, E'\\\\D|^1', '', 'g') = '%(phone)s'
OR regexp_replace(biz_cell_2, E'\\\\D|^1', '', 'g') = '%(phone)s';
"""
result = run_query(query_string, {'phone': app_phone})
This solution will save you from (most) sql injection attacks
2) To build the query you can consider using sql query building library (https://pypi.python.org/pypi/python-sql/0.2). That will allow you to build SQL queries in terms of expressions, not using string editing. Not sure if this query builder will support usage of regexp in where though
3) You can try to use loop, but the question if it's become more readable will be subjective, imho:
app_phone = 5555555555
cmp_phones = "regexp_replace(%s, E'\\\\D|^1', '', 'g') = '%%(phone)s'"
db_phone_columns = (biz_phone_1, biz_phone_2, biz_cell_1, biz_cell_2)
where_condition = 'OR'.join(cmp_phones % phone for phone in db_phone_columns)
result = run_query(query_string, {'phone': app_phone}
query_string="""SELECT biz_name, biz_addr, biz_owner
FROM business_t
WHERE %(where_condition)s;""" %
{'where_condition': where_condition}
result = run_query(query_string, {'phone': app_phone})
I personally find solution 1) most readable
4) Use stored procedure with phone as a parameter
5) Formatting of the query inside the query string that I personally prefer is demonstrated in the examples
string.format, because I find it more readable, but it does add a (tiny amount) of run-time overhead. (i.e.query_string = """... {app_phone} ... {app_phone}...""".format(app_phone = "555555555")