正则表达式与python中的URL模式上的结束美元符号匹配

时间:2017-03-22 19:50:21

标签: python regex regex-greedy

在这种情况下,我想在URL中提取辅助路径,因此以下URL应该都返回'a-c-d'

/opportunity/a-c-d
/opportunity/a-c-d/
/opportunity/a-c-d/123/456/
/opportunity/a-c-d/?x=1
/opportunity/a-c-d?x=1

我的代码段如下:

m = re.match("^/opportunity/([^/]+)[\?|/|$]", "/opportunity/a-c-d")
if m:
    print m.group(1)

它适用于除第一个/opportunity/a-c-d之外的所有可能的URL。任何人都可以帮助解释原因并纠正我的正则表达式吗?非常感谢!

4 个答案:

答案 0 :(得分:3)

不要这样做。请改用urlparse模块。

以下是一些测试代码:

AND ( len(@cnpj) > 0
       AND S.CGC_Cliente + '-' + S.Seq_Cliente in (SELECT cnpjseq FROM #Tb_CliSelecionados))

这是输出

from urlparse import urlparse

urls = [
  '/opportunity/a-c-d',
  '/opportunity/a-c-d/',
  '/opportunity/a-c-d/123/456/',
  '/opportunity/a-c-d/?x=1',
  '/opportunity/a-c-d?x=1',
]

def secondary(url):
  try:
    return urlparse(url).path.split('/')[2]
  except IndexError:
    return None

for url in urls:
  print '{0:30s} => {1}'.format(url, secondary(url))

答案 1 :(得分:1)

替代模式应位于()内,而不是[],用于匹配特定字符。

您还应该使用原始字符串,以便将转义序列逐字地发送到re模块,而不是在Python字符串中解释。

m = re.match(r"^/opportunity/([^/]+)(\?|/|$])", "/opportunity/a-c-d")

m = re.match(r"^/opportunity/([^/]+)([?/]|$])", "/opportunity/a-c-d")

答案 2 :(得分:1)

正则表达式中的$与文字“$”字符匹配,而不是行尾字符。相反,你可能想要这个:

m = re.match(r"^/opportunity/([^/?]+)\/?\??", "/opportunity/a-c-d")
if m:
    print m.group(1)

答案 3 :(得分:0)

使用()包含您需要的所有内容。

[re.sub(r'.*(\w+-\w+-\w+).*',r'\1',x) for x in urls]