在这种情况下,我想在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。任何人都可以帮助解释原因并纠正我的正则表达式吗?非常感谢!
答案 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]