Номер телефона Python Regex (Pattern Matching) начинается с поиска кода города - PullRequest
0 голосов
/ 22 октября 2019

Я новичок в Python, я пытался написать логику для извлечения номера телефона, который начинается с определенных кодов города (первые 3 цифры номера телефона) в данном файле данных. Мой код

Код

import re

data="This is the sample test data. 2247279133 224dfa7279133 dhana 5107279133 subha 123456789 "

pattern = re.compile(r"((224|510)\d{7})")
matches = pattern.findall(data)

for match in matches:
    print (match[0])

Я получаю ожидаемый вывод, как показано ниже,
Вывод

2247279133

5107279133


Хотя я получаю ожидаемый результат, я хотел бы знать следующие вещи,

  1. Является ли этоэффективный способ?
  2. Можно ли передать список кодов областей в виде переменной массива вместо жесткого кодирования (224 | 510)?
  3. Каков рекомендуемый способ поиска таких телефонных номеровнад большим файлом 10 ГБ?

1 Ответ

1 голос
/ 22 октября 2019

Сначала замечание относительно вашего регулярного выражения. Поскольку вы в настоящее время указали свое регулярное выражение, вы должны соответствовать 2247279133 в следующей строке:

Это примерные данные теста: 1232247279133987 224dfa7279133 и т. Д.

Это то, что вы хотели бы? Возможно, вам может потребоваться, чтобы номер телефона был разделен пробелами с обеих сторон, если не в начале или в конце строки:

pattern = re.compile(r"(?:\A|\s)((224|510)\d{7})(?=\Z|\s)")

Теперь, чтобы ответить на ваши вопросы:

  1. Насколько я понимаю, механизм регулярных выражений в Python основан на возврате и поэтому не самый эффективный метод поиска ваших телефонных номеров в теории . Вы могли бы сделать лучше, если бы вы вручную кодировали конечный автомат для распознавания конкретных телефонных номеров, которые вы ищете. Но это может вам ничего не дать, потому что это будет работать как интерпретируемый код Python по сравнению с механизмом регулярных выражений, который работает как код языка Си. Кроме того, ваше регулярное выражение не слишком сложное, требующее много возврата. Наконец, если вы хотите обработать массив кодов городов, предоставляемых во время выполнения, вам потребуется создать FSA во время выполнения. Этот алгоритм для этого достаточно сложен и, вероятно, является более сложной задачей, чем вы хотели бы взять на себя. Суть в том, что то, что вы делаете, является, вероятно, наиболее эффективным подходом, который вы можете использовать на практике .

  2. Да. Строка, которую вы передаете re.compile, может быть частично создана во время выполнения путем вызова '|'.join(area_codes), где area_code s - список кодов городов.

  3. Вы должны исследовать, используяутилита Unix / Linux grep в качестве фильтра первого шага (к сожалению, grep выводит всю строку, содержащую искомый шаблон), если вас не устраивает производительность только на Python.

...