Извлечение подстроки между несколькими определенными словами с помощью регулярных выражений в Python - PullRequest
0 голосов
/ 06 сентября 2018

Подстрока Regex

Я хочу извлечь Телефон, Факс, Мобильный Я получаю из строки, если нет Может вернуть пустую строку.Я хочу, чтобы 3 списка телефонов, факсов, мобильных телефонов из любого данного примера текстовой строки приведены ниже.

ex1 = "miramar road margie shoop san diego ca 12793 manager  phone 6035550160 fax 6035550161 mobile 6035550178  marsgies travel  wwwmarpiestravelcom"
ex2 = "david packard electrical engineering  350 serra mall room 170 phone 650 7259327  stanford university fax 650 723 1882 stanford california 943059505 ulateecestanfordedu"
ex3 = "stanford  electrical  engineering  vijay chandrasekhar  electrical engineering 17 comstock circle apt 101  stanford ca 94305  phone 9162210411"

Это возможно с помощью регулярного выражения:

phone_regex  = re.match(".*phone(.*)fax(.*)mobile(.*)",ex1)
phone = [re.sub("[^0-9]","",x) for x in phone_regex.groups()][0]
mobile = [re.sub("[^0-9]","",x) for x in phone_regex.groups()][2]
fax = [re.sub("[^0-9]","",x) for x in phone_regex.groups()][1]

Результат с ex1:
телефон = 6035550160
факс = 6035550161
моб. = 6035550178

ex2 не имеет моб. запись, поэтому я получаю:

Traceback (последний последний вызов):
phone = [re.sub ("[^ 0-9]", "", x)для x в phone_regex.groups ()] [0]
AttributeError: у объекта 'NoneType' нет атрибута 'groups'

Вопрос
Мне нужно либо лучшее решение для регулярных выражений, поскольку я новичок в регулярных выражениях, либо решение, чтобы перехватить AttributeError и назначить null string.

Ответы [ 4 ]

0 голосов
/ 06 сентября 2018

Я думаю, что следующие регулярные выражения должны работать нормально:

mobile = re.findall('mobile([0-9]*)', ex1.replace(" ",""))[0]
fax = re.findall('fax([0-9]*)', ex1.replace(" ",""))[0]
phone = re.findall('phone([0-9]*)', ex1.replace(" ",""))[0]
0 голосов
/ 06 сентября 2018

Использование re.search

Демо:

import re

ex1 = "miramar road margie shoop san diego ca 12793 manager  phone 6035550160 fax 6035550161 mobile 6035550178  marsgies travel  wwwmarpiestravelcom"
ex2 = "david packard electrical engineering  350 serra mall room 170 phone 650 7259327  stanford university fax 650 723 1882 stanford california 943059505 ulateecestanfordedu"
ex3 = "stanford  electrical  engineering  vijay chandrasekhar  electrical engineering 17 comstock circle apt 101  stanford ca 94305  phone 9162210411"

for i in [ex1, ex2, ex3]:
    phone = re.search(r"(?P<phone>(?<=\phone\b).*?(?=([a-z]|$)))", i)
    if phone:
        print "Phone: ", phone.group("phone")

    fax = re.search(r"(?P<fax>(?<=\bfax\b).*?(?=([a-z]|$)))", i)
    if fax:
        print "Fax: ", fax.group("fax")

    mob = re.search(r"(?P<mob>(?<=\bmobile\b).*?(?=([a-z]|$)))", i)
    if mob:
        print "mob: ", mob.group("mob")
    print("-----")

Выход:

Phone:   6035550160 
Fax:   6035550161 
mob:   6035550178  
-----
Phone:   650 7259327  
Fax:   650 723 1882 
-----
Phone:   9162210411
-----
0 голосов
/ 06 сентября 2018

Вы можете использовать простой re.findall, например:

dict(re.findall(r'\b({})\s*(\d+)'.format("|".join(keys)), ex))

регулярное выражение будет выглядеть как

\b(phone|fax|mobile)\s*(\d+)

См. Демоверсию regex онлайн .

Детали шаблона

  • \b - граница слова
  • (phone|fax|mobile) - Группа 1: одно из перечисленных слов
  • \s* - 0+ пробелов
  • (\d+) - Группа 2: одна или несколько цифр

См. Демоверсию Python :

import re
exs = ["miramar road margie shoop san diego ca 12793 manager  phone 6035550160 fax 6035550161 mobile 6035550178  marsgies travel  wwwmarpiestravelcom",
   "david packard electrical engineering  350 serra mall room 170 phone 650 7259327  stanford university fax 650 723 1882 stanford california 943059505 ulateecestanfordedu", 
   "stanford  electrical  engineering  vijay chandrasekhar  electrical engineering 17 comstock circle apt 101  stanford ca 94305  phone 9162210411"]
keys = ['phone', 'fax', 'mobile']
for ex in exs:
    res = dict(re.findall(r'\b({})\s*(\d+)'.format("|".join(keys)), ex))
    print(res)

Выход:

{'fax': '6035550161', 'phone': '6035550160', 'mobile': '6035550178'}
{'fax': '650', 'phone': '650'}
{'phone': '9162210411'}
0 голосов
/ 06 сентября 2018

Я думаю, я понимаю, что вы хотите .. и это связано с получением именно первого соответствия после ключевого слова. Что вам нужно в таком случае - это вопросительный знак:

"'?' также является квантификатором. Сокращенно от {0,1}. Это означает «Совпадение нуля или одной группы, предшествующей этому вопросительному знаку.» Это также может быть интерпретировано как необязательная часть, предшествующая вопросительному знаку »*

А вот код, который должен работать, если определения недостаточно

import re
res_dict = {}
list_keywords = ['phone', 'cell', 'fax']
for i_key in list_keywords:
    temp_res = re.findall(i_key + '(.*?) [a-zA-Z]', ex1)
    res_dict[i_key] = temp_res
...