【问题标题】:How to extract a string always comes after specific string and optionally followed by a string如何提取字符串总是在特定字符串之后,并且可选地后跟一个字符串
【发布时间】:2019-07-22 20:10:32
【问题描述】:

如果我有一个字符串,则前面总是有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)如何捕获有/没有以下/字符(因为我的解决方案需要/

【问题讨论】:

  • re.search('www.+com',s).group()
  • 正如我在问题中所说的那样,www. 我的固定字符并不总是http://
  • 试试http://([^/]*)/?,见this regex demo
  • @Wiktor Stribiżew 如何尝试?使用重新?你能写出整行吗?
  • 是的,re 就足够了。 print(re.search(r'http://([^/]*)/?','http://www.mymovies.com').group(1))print(re.search(r'http://([^/]*)/?','http://www.mymovies.com/').group(1))。我不知道你想匹配什么其他类型的 URL,因此,这是一个建议。

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


【解决方案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))

【讨论】:

  • 你的意思是http - https子字符串(你忘了's')
  • @user9371654 我没有忘记s,请参阅模式中的https?:它匹配httphttps,因为s? 匹配可选的s,即1 或0 s 字符。
  • 你能仔细检查第一个要点吗?这就是我的意思。
  • @user9371654 很好,因为它后面是第二个要点。请完整查看该模式。
  • 现在我明白你的意思了。对不起。
【解决方案2】:

试试正则表达式:(?&lt;=http:\/\/)\[^\/\]+?(?=\/|$)

Demo

【讨论】:

    【解决方案3】:

    您的搜索字符串是http://(.*)/,因此末尾的/ 是强制性的。如果你在它后面加上?,你可以让它成为可选的,或者你可以完全忽略它。如果您不希望它成为结果字符串的一部分,请将其之前的匹配字符限制为除 / 之外的所有字符:

    https://([^/]*)
    

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

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

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

    【讨论】:

      【解决方案4】:

      您可以使用 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"
      

      【讨论】:

        猜你喜欢
        • 2012-09-16
        • 2022-08-10
        • 2021-10-30
        • 1970-01-01
        • 2017-07-19
        • 2019-07-08
        • 1970-01-01
        相关资源
        最近更新 更多