Как извлечь часть URL из значения словаря в Python? - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть словарь, в котором значение ключа равно

https://service-dmn1-region.com/info 4169 description

Меня интересует выбор области dmn1 из этой части URL-адреса и вывод описания 4169 как есть.Поэтому я намерен напечатать результат как:

dmn1-region: 4169 description

Как вы думаете, это возможно без сложного регулярного выражения / регулярного выражения.Скрипт на python и пробовал это -

import re print re.sub('https://','',dictionary[key])

Это просто удаляет часть https: // и показывает результат как service-dmn1-region.com/info 4169 description.Но я не уверен, как достичь вышеуказанного намеченного пути.

пары ключ-значение из словаря выглядят как -

dictionary = {'service': 'https://service-dmn1-region.com/info 4169 description',
'service1': 'https://service1-dmn2-region2.com/info 5123 someDescription','service2': 'https://dmn1-region-service2.com/info'}

Любые идеи и помощь очень приветствуются.

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Я бы использовал что-то вроде:

import re
for k, v in dictionary.items(): # .iteritems() for py2
    print(re.sub(r"^.*?{}-([^.]+).*?(\d+)\s(.*?)$".format(k), r"\1 :\2 \3", v))

dmn1-region :4169 description
dmn2-region2 :5123 someDescription

DEMO

0 голосов
/ 04 декабря 2018

для значений типа https://service-dmn1-region.com/info 4169 description

, которые вы можете просто найти на ^[^-]+-([^.]+)[^\s]+ (.*)$

[harald@localhost ~]$ python3
Python 3.6.6 (default, Jul 19 2018, 14:25:17) 
[GCC 8.1.1 20180712 (Red Hat 8.1.1-5)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> val = 'https://service-dmn1-region.com/info 
4169 description'
>>> res = re.match('^[^-]+-([^.]+)[^\s]+ (.*)$', val)
>>> res.group(1)
'dmn1-region'
>>> res.group(2)
'4169 description'

, где ^[^-]+ соответствует началу ввода (начальное значение ^) все, что не является апострофом - ([^-]+), поэтому https://service

затем вы указываете, что должен следовать один апостроф, который следует за ^[⁻]+-, и что вы хотите захватить все, что следуетследующий, который не является точкой с ([^.]+).(как вы уже догадались, исключение вашего шаблона с помощью ^ отменяет его, и шаблон записывается в квадратных скобках [].

Приводит нас к ^[^-]+-([^.]+), затем вы хотите игнорировать все до следующего пробела, так как он разделяетсядругие значения из строки, так что вы добавляете сопоставление с образцом для всего, что не является пробелом (\ s), приводя к дополнительным [^\s]+, поэтому ^[^-]+-([^.]+)[^\s]+

, за которым вы затем хотите следовать разделителю пробелов (если ожидаете больше 1 пробела, вы можете использовать \s* вместо фактического пробела) и добавить окончательный универсальный шаблон захвата (.*), который будет захватывать 4169 description (точка обозначает все символы здесь) до концаввода $, ведущий к ^[^-]+-([^.]+)[^\s]+ (.*)$.

0 голосов
/ 04 декабря 2018

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

dictionary = {'service': 'https://service-dmn1-region.com/info 4169 description',
              'service1': 'https://service1-dmn2-region2.com/info 5123 someDescription'}


def extract(key, s):
    info = '/info'
    service = key + '-'
    return s[s.find('service') + len(service):s.find('.com')], s[s.find(info) + len(info):].strip()


for key, value in dictionary.items():
    region, info = extract(key, value)
    print('{0}:{1}'.format(region, info))

Вывод

dmn2-region2:5123 someDescription
dmn1-region:4169 description

Обратите внимание, что URL являются значениями словаря, а не keys .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...