使用正则表达式从URL中提取子字符串

时间:2014-01-26 06:36:47

标签: python regex python-2.7

正规新手在这里。我有一堆URL,我需要从中提取一些我正在使用正则表达式的子串。

例如:如果我的网址为https://chrome.google.com/webstore/detail/vt-hokie-stone-theme/enmbbbhbkojhbkbolmfgbmlcgpkjjlja?hl=en-US,我需要将此网址中的1. vt-hokie-stone-theme部分和2. enmbbbhbkojhbkbolmfgbmlcgpkjjlja部分提取为两个单独的变量。

我的网址的初始部分始终保持不变,因此我构建了以下正则表达式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 个答案:

答案 0 :(得分:3)

  1. 您可以使用元组/列表赋值语法来实现此目的:

    try:
        var1, var2 = re.search(r"detail\/([a-z0-9\-]+)\/([a-z]+)", my_url).groups()
    except AttributeError:
        var1 = var2 = ""
    
  2. unicode字符串只能在网站的答案中看到,而在原始python中,返回值将是普通字符串。所以,你不必担心它。

答案 1 :(得分:0)

  1. 我个人没有看到只是从findall()数组的第一个索引设置变量的问题。但是,如果您确信您的正则表达式始终与确切的url字符串匹配,则可以尝试re.match:

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

    在[23]中:regex.match('abccd')。groups()

    Out [23] :('bc','cd')

  2. unicode有什么问题?你为什么不想保留它?我知道正则表达式只会返回ascii,所以这不是问题。无论哪种方式,如果使它们成为常规字符串非常重要,只需将其转换为字符串即可。

    str(u'abc')=='abc'

答案 2 :(得分:0)

您可以使用以下正则表达式来实现相同的目标。如果您确定URL的格式,可以尝试以下内容。请注意,最后一个。*正则表达式捕获组 base 是非贪婪的。*正则表达式捕获组主题是非贪婪的。

>>> 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