python中URL的正则表达式

python中URL的正则表达式,python,regex,Python,Regex,这个URL不应该是无效的,因为www前面有一个点吗 我的输出显示: url1='http://.www.youtube.com/watch?v=tKTZoB2Vjuk&index=1&list=PLqmh7e11V6OzWBTSYNq1yYznar709uDQx' #url2='www.ssa.gov/cgi-bin/popularnames.cgi' def verify(url): try: x=re.search('((^https|http|ftp

这个URL不应该是无效的,因为www前面有一个点吗

我的输出显示:

url1='http://.www.youtube.com/watch?v=tKTZoB2Vjuk&index=1&list=PLqmh7e11V6OzWBTSYNq1yYznar709uDQx'
#url2='www.ssa.gov/cgi-bin/popularnames.cgi'
def verify(url):
    try:
        x=re.search('((^https|http|ftp):)?(/?/?www)\.[a-zA-Z0-9]+\.[a-zA-Z]{2,3}\/[-a-zA-Z0-9?=&%#./]*',url)
        print x.group()

    except:
        print "not valid"

verify(url1)

只有
https
被锚定到字符串的开头,协议组被标记为可选。因此,您的正则表达式将匹配任何包含URI(由正则表达式定义)的文本,只要它不需要以
https
开头

我建议完全删除
^
并使用
re.match
而不是
re.search


您的正则表达式还存在其他问题,这些问题将阻止它匹配其他完全有效的URI。

让我们对您的正则表达式进行分解:

www.youtube.com/watch?v=tKTZoB2Vjuk&index=1&list=PLqmh7e11V6OzWBTSYNq1yYznar709uDQx
从上面可以看出,协议和斜杠都是可选的,所以不管一开始是什么,您的正则表达式所需要的都是某个地方的www。

相关:但是
www
之前的所有位都是可选的,所以它们只是被跳过(参见示例)!如果希望将正则表达式锚定到字符串的开头,请在开头(左括号外)添加一个
^
,并使用
匹配
,而不是
搜索
,使用
匹配
“应该是”或使用
匹配
,因为
^
匹配根本不需要。
(                    # begin group
  (^https|http|ftp): # protocol (and only https needs to be at the start)
)?                   # end optional group
(                    # start group
  /?/?               # optional slashes
  www                # www
)                    # end group
...