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

Python 使用正则表达式从URL提取子字符串,python,regex,python-2.7,Python,Regex,Python 2.7,这里是Regex新手。我有一堆URL,需要从中提取一些使用正则表达式的子字符串 例如:如果我的URL是https://chrome.google.com/webstore/detail/vt-hokie-stone-theme/enmbbbhbkojhbkbolmfgbmlcgpkjjlja?hl=en-美国,我需要提取1vt hokie stone主题第二部分和第二部分enmbbbhbkojhbkbkbbolmfgbmlcgpkjjjlja将此url分成两个单独的变量 我的URL的初始部分始终

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

例如:如果我的URL是
https://chrome.google.com/webstore/detail/vt-hokie-stone-theme/enmbbbhbkojhbkbolmfgbmlcgpkjjlja?hl=en-美国
,我需要提取1<代码>vt hokie stone主题第二部分和第二部分
enmbbbhbkojhbkbkbbolmfgbmlcgpkjjjlja
将此url分成两个单独的变量

我的URL的初始部分始终保持不变,因此我构建了以下正则表达式
detail\/([a-z0-9\-]+)\/([a-z]+)
,我正在尝试

我看到
regex.findall(string)
给了我想要的,但我有以下问题:

  • 我希望它们在两个独立的变量中,而不是在单个变量中作为列表格式。我该怎么做

  • 另外,在pythonregex上检查时,
    regex.findall(string)
    命令将输出为
    [(u'vt-hokie-stone-theme',u'enmbbbhbkojhbkbbolmfgbmlcgpkjjjjlja')]
    。我知道前面的
    u
    表示unicode,但我不希望它出现在我的输出中。如何删除它

  • 我个人并不认为仅仅从findall()数组的第一个索引设置变量有什么问题。但是,如果您确信您的正则表达式将始终匹配准确的url字符串,则可以尝试重新匹配:

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

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

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

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

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

  • 您可以使用元组/列表分配语法来实现这一点:

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


  • 您可以使用下面的正则表达式来实现同样的效果。如果您确定URL的格式,您可以尝试下面的方法。请注意,最后一个捕获th groups base的.*regex是非贪婪的,而捕获group主题的.*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
    
    >>var='0https://chrome.google.com/webstore/detail/vt-hokie-stone-theme/enmbbbhbkojhbkbolmfgbmlcgpkjjlja?hl=en-U'
    >>>match=re.match(r“(?P.*/webstore/*?/)(?P.*?/(?P.*”),var);
    >>>如果匹配:
    ...    打印匹配。组('base'))
    ...    打印匹配。组('主题')
    ...    打印匹配。组('tail'))
    https://chrome.google.com/webstore/detail/
    霍基斯通主题酒店
    Enmbbbhbkojhbkbbolmfgbmlcgpkjjjlja?hl=en-U
    
    如果regexp不匹配,此操作将中断。感谢您的注意。编辑了答案,以便在regexp不匹配的情况下处理异常。谢谢,这很有帮助!:)