Я также предложил бы посмотреть в библиотеке Google libphonenumber . Я знаю, что это не регулярное выражение, но оно делает именно то, что вы хотите.
Например, он распознает, что:
15555555555
- это возможное число, но не действительное число. Он также поддерживает страны за пределами США.
Основные функции:
getNumberType
- получает тип числа, основанного на самом номере; isNumberMatch
- получает уровень уверенности в том, могут ли два числа быть getExampleNumber
/ getExampleNumberByType
- предоставляет действительные номера примеров для всех стран / регионов, с возможностью указать, какой тип номера номера телефона необходим. isPossibleNumber
- быстро угадывая, является ли число возможным номером звонка, используя только информацию о длине, намного быстрее, чем полная проверка. isValidNumber
- полная проверка номера телефона для региона с использованием информации о длине и префиксе . AsYouTypeFormatter
- форматирует номера телефонов «на лету», когда пользователи вводят каждую цифру. findNumbers
- находит номера в текстовом вводе. PhoneNumberOfflineGeocoder
- предоставляет географическую информацию, относящуюся к номеру телефона. Самая большая проблема с проверкой номера телефона - это очень культурная зависимость.
(408) 974–2042
является действительным Номер в США (999) 974–2042
не является допустимым номером в США 0404 999 999
является действительным австралийским номером (02) 9999 9999
, также является действительным австралийским номером (09) 9999 9999
, не является действительным австралийским номером Регулярное выражение отлично подходит для проверки формата номера телефона, но на самом деле не будет возможности проверить действительность номера телефона.
Я бы предложил пропустить простое регулярное выражение, чтобы проверить ваш номер телефона, и использовать библиотеку, такую как libphonenumber
Google [ссылка на проект GitHub] .
Используя один из ваших более сложных примеров, 1-234-567-8901 x1234
, вы получаете следующие данные из libphonenumber
(ссылка на онлайн-демонстрацию) :
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() true
Formatting Results:
E164 format +12345678901
Original format (234) 567-8901 ext. 123
National format (234) 567-8901 ext. 123
International format +1 234-567-8901 ext. 123
Out-of-country format from US 1 (234) 567-8901 ext. 123
Out-of-country format from CH 00 1 234-567-8901 ext. 123
Таким образом, вы не только узнаете, действительно ли номер телефона (какой он есть), но также вы получаете согласованную форму номера телефона
В качестве бонуса, libphonenumber
имеет ряд наборов данных для проверки правильности номеров телефонов, поэтому, проверяя число, например +61299999999
(международная версия (02) 9999 9999
) возвращает в качестве допустимого числа с форматированием:
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() true
Formatting Results
E164 format +61299999999
Original format 61 2 9999 9999
National format (02) 9999 9999
International format +61 2 9999 9999
Out-of-country format from US 011 61 2 9999 9999
Out-of-country format from CH 00 61 2 9999 9999
libphonenumber также дает вам много дополнительных преимуществ, таких как захват местоположения, в котором обнаружен номер телефона, а также получить информацию о часовом поясе с номера телефона:
PhoneNumberOfflineGeocoder Results
Location Australia
PhoneNumberToTimeZonesMapper Results
Time zone(s) [Australia/Sydney]
Но неверный номер австралийского телефона ( (09) 9999 9999
) показывает, что он не является действительным номером телефона.
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() false
Версия Google имеет код для Java и Javascript, но люди также реализовали библиотеки для других языков, которые используют набор данных телефона i18n для Google:
Если вы не уверены, что находитесь всегда собираюсь принимать номера из одной локали, и они всегда будут в одном формате, я бы сильно предложил не писать собственный код для этого и использовать libphonenumber для проверки и отображения номеров телефонов.
Я не совсем уверен, правильно ли я вас понял, когда вы говорите Я получаю значение каждого столбца в качестве индекса массива , но предположим, что у вашей табличной персоны есть имя, фамилия, столбцы возраста и ваши данные представляют собой как следующие
data = [["Hans", "Muster", 23], ["Jane", "Doe", 46], ["John", "Doe", 26]]
Два возможных коротких способа добиться вставки: ..
Вариант 1. Вы можете повторять и сохранять одну запись за раз
# get connection and cursor object
query= "INSERT INTO PERSON (FIRSTNAME, LASTNAME, AGE) VALUES (%s, %s, %s)"
for rec in data:
record = tuple(rec)
cursor.execute(query, record)
#handle commit or rollback as necessary
[119 ] Вариант 2 - вы можете использовать executemany, чтобы сохранить все записи за один раз
# get connection and cursor object
query= "INSERT INTO PERSON (FIRSTNAME, LASTNAME, AGE) VALUES (%s, %s, %s)"
tupleRecords = [tuple(rec) for rec in data]
cursor.executemany(query, tupleRecords)
#handle commit or rollback as necessary
Вы можете сделать что-то вроде ниже, чтобы вставить список значений. Источник: https://www.w3schools.com/python/python_mysql_insert.asp
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="yourusername",
passwd="yourpassword",
database="mydatabase"
)
mycursor = mydb.cursor()
sql = "INSERT INTO customers (name, address) VALUES (%s, %s)"
val = [
('Peter', 'Lowstreet 4'),
('Amy', 'Apple st 652'),
('Hannah', 'Mountain 21'),
('Michael', 'Valley 345'),
('Sandy', 'Ocean blvd 2'),
('Betty', 'Green Grass 1'),
('Richard', 'Sky st 331'),
('Susan', 'One way 98'),
('Vicky', 'Yellow Garden 2'),
('Ben', 'Park Lane 38'),
('William', 'Central st 954'),
('Chuck', 'Main Road 989'),
('Viola', 'Sideway 1633')
]
mycursor.executemany(sql, val)
mydb.commit()
print(mycursor.rowcount, "was inserted.")