2014-01-26 2 views
1

Regex новичок здесь. У меня есть куча URL-адресов, из которых мне нужно извлечь некоторые подстроки, для которых я использую регулярное выражение.Извлечение подстроки из URL с использованием regex

Ех: Если мой URL-адрес https://chrome.google.com/webstore/detail/vt-hokie-stone-theme/enmbbbhbkojhbkbolmfgbmlcgpkjjlja?hl=en-US, мне нужно извлечь часть 1. vt-hokie-stone-theme и 2. enmbbbhbkojhbkbolmfgbmlcgpkjjlja часть этого URL-адреса на две отдельные переменные.

Начальная часть моего URL всегда остается постоянной, поэтому я построил следующее регулярное выражение detail\/([a-z0-9\-]+)\/([a-z]+), и я пытаюсь Мах на http://www.pythonregex.com/

Я вижу, что regex.findall(string) дает мне то, что я хочу, но у меня есть следующие вопросы:

  1. Я хочу, чтобы они были в двух отдельных переменных, вместо того, чтобы иметь их как формат списка в одной переменной. Как мне это сделать?

  2. Кроме того, при проверке на pythonregex команда regex.findall(string) дает результат как [(u'vt-hokie-stone-theme', u'enmbbbhbkojhbkbolmfgbmlcgpkjjlja')]. Я понимаю, что предыдущий u означает unicode, но я не хочу этого в своем выходе. Как его удалить?

ответ

3
  1. Вы можете использовать синтаксис назначения кортеж/список для достижения этой цели:

    try: 
        var1, var2 = re.search(r"detail\/([a-z0-9\-]+)\/([a-z]+)", my_url).groups() 
    except AttributeError: 
        var1 = var2 = "" 
    
  2. Строки Юникода видно только в ответах на сайте, а в необработанном питоне возвращаемые значения будут нормальными. Поэтому вам не о чем беспокоиться.

+0

Это сломается, если регулярное выражение не совпадает. – michaelmeyer

+0

Спасибо, что заметили. Отредактировал ответ для обработки исключения в случае, если регулярное выражение не совпадает. –

+0

Спасибо, это полезно! :) – TheRookierLearner

0
  1. лично я не вижу проблемы в просто установив переменные из первого индекса массива FindAll(). Но если вы уверены, что ваше регулярное выражение всегда будет соответствовать точной строке URL, вы можете попробовать re.match:

    В [22]: regex = re.compile ('a (bc) (cd) ')

    В работе [23]: regex.match (' abccd ') группы()

    Out [23]:. (' BC», 'CD')

  2. Что вопрос с юникода? Почему бы вам не оставить его? Я знаю, что регулярное выражение все равно вернет ascii, так что это не проблема. В любом случае, если действительно важно сделать их регулярными строками, просто отбросьте его на строку.

    ул (u'abc ') == 'абв'

0

Вы можете использовать ниже регулярное выражение для достижения того же. Если вы уверены в формате URL-адреса, вы можете попробовать что-то вроде ниже. Обратите внимание, что последний. * Regex захват групп база не является жадным и. * Regex захват группы тема не является жадным.

>>> var = 'https://chrome.google.com/webstore/detail/vt-hokie-stone-theme/enmbbbhbkojhbkbolmfgbmlcgpkjjlja?hl=en-U' 

>>> match = re.match(r"(?P<base>.*/webstore/.*?/)(?P<theme>.*?)/(?P<tail>.*)",var); 
>>> if match: 
     ... print match.group('base') 
     ... print match.group('theme') 
     ... print match.group('tail') 

https://chrome.google.com/webstore/detail/ 
vt-hokie-stone-theme 
enmbbbhbkojhbkbolmfgbmlcgpkjjlja?hl=en-U 
Смежные вопросы