如何提取字符串始终位于特定字符串之后,并且可以选择后面跟一个字符串

时间:2019-02-28 20:25:13

标签: python regex python-3.x string search

如果我有一个字符串,它总是以http://开头,并可选地以/跟随。示例:

http://www.mymovies.com/

但有时可以采用以下格式:     http://www.mymovies.com

我要提取www.mymoviews.com 我想同时捕获两种格式(带/不带/

我尝试使用:

import re
print(re.search('http://(.*)/','http://www.mymovies.com').group(1))

但是我得到这个错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'

1)如何解决错误 2)如何同时捕获有无以下/字符(因为我的解决方案需要/

4 个答案:

答案 0 :(得分:1)

您可以使用

m = re.search(r'https?://([^/]*)/?','http://www.mymovies.com')
if m:
    print(m.group(1))

请参见regex demo

详细信息

  • http-http子字符串
  • s?-1或0 s个字符
  • ://-一个://子字符串
  • ([^/]*)-捕获组1:/以外的零个或多个字符
  • /?-1或0 /个字符。

Python demo(输出四个www.mymovies.com作为输出):

import re
strs = ['http://www.mymovies.com/','http://www.mymovies.com','https://www.mymovies.com/','https://www.mymovies.com']
r = re.compile(r'https?://([^/]*)/?')
for s in strs:
    m = r.search('http://www.mymovies.com')
    if m:
        print(m.group(1))

答案 1 :(得分:0)

您的搜索字符串为http://(.*)/,因此末尾的/是必填项。如果将?放在其后,则可以将其设为可选,也可以完全不使用它。如果您不希望它成为结果字符串的一部分,则可以将其前面的匹配字符限制为除/以外的所有字符:

https://([^/]*)

或在操作后进行简单的最后一个字符检查,如果是/,则将其删除:

if result[-1] == "/": result = result[:-1]

还应注意,如果您输入的内容可以是完整的URL(包括路径和?key=value对),则应进一步限制匹配的字符。

答案 2 :(得分:0)

尝试使用正则表达式:(?<=http:\/\/)\[^\/\]+?(?=\/|$)

Demo

答案 3 :(得分:0)

您可以使用split()方法在不使用正则表达式的情况下进行操作:

url.split("/")[2]

'http://www.mymovies.com/'.split("/")[2] ==> "www.mymovies.com"

'http://www.mymovies.com'.split("/")[2] ==> "www.mymovies.com"

'http://www.mymovies.com/star-wars/episodeV'.split("/")[2] ==> "www.mymovies.com"