8

我不是正则表达式专家,我正在尝试做一个看起来非常简单且适用于 python 2.7 的方法:验证没有查询字符串的 URL 的路径(无主机名)。换句话说,以 / 开头的字符串允许字母数字值,并且不允许任何其他特殊字符,除了这些:/, ., -

我发现这篇文章与我需要的非常相似,但对我来说根本不起作用,例如我可以测试aaa它,即使它不以 . 开头,它也会返回 true /

我正在使用的当前正则表达式是这个:

[^/+a-zA-Z0-9.-]

但它不适用于不以 . 开头的路径/。例如:

  • /aaa-> 是的,这没关系
  • /aaa/bbb-> 是的,这没关系
  • /aaa?q=x-> false,这没关系
  • aaa-> 是的,这不行
4

4 回答 4

6

您定义的正则表达式是一个字符类。相反,请尝试:

^\/[/.a-zA-Z0-9-]+$
于 2012-10-17T07:08:01.710 回答
3

换句话说,以 / 开头的字符串允许使用字母数字值,并且不允许使用除这些以外的任何其他特殊字符:/、.、-

您缺少一些在 URL 中有效的字符

import string
import urllib
import urlparse

valid_chars = string.letters + string.digits + '/.-~'
valid_paths = []

urls = ['http://www.my.uni.edu/info/matriculation/enroling.html',
    'http://info.my.org/AboutUs/Phonebook',
    'http://www.library.my.town.va.us/Catalogue/76523471236%2Fwen44--4.98',
    'http://www.my.org/462F4F2D4241522A314159265358979323846',
        'http://www.myu.edu/org/admin/people#andy',
        'http://www.w3.org/RDB/EMP?*%20where%20name%%3Ddobbins']

for i in urls:
   path = urllib.unquote(urlparse.urlparse(i).path)
   if path[0] == '/' and len([i for i in path if i in valid_chars]) == len(path):
        valid_paths.append(path)
于 2012-10-17T07:26:10.740 回答
0

试试这个:

^(?:/[a-zA-Z0-9.-&&[^/]]*)+$

似乎工作。看图片: 在此处输入图像描述

于 2012-10-17T07:07:45.277 回答
0

尝试发布更多代码。我无法从你的问题中弄清楚你是如何使用你的正则表达式的。令我困惑的是,您的 re 表达[^/+a-zA-Z0-9.-]基本上是说:

如果是,则匹配单个字符:

不是 a/ 或 az(大写和小写)或 0-9 或点或破折号

如果不知道您如何使用它,这对我来说不太有意义,因为它只匹配单个字符而不是整个 URL 字符串。

我不确定我理解为什么你不能以/.

于 2012-10-17T07:08:20.797 回答