【问题标题】:Regex to find hostname in a string [duplicate]正则表达式在字符串中查找主机名 [重复]
【发布时间】:2016-05-07 09:32:23
【问题描述】:

我正在使用正则表达式在字符串中查找主机名,该字符串匹配所有可能的组合,但无法构造一个。

names = ['www.google.com.in','w.stack.in','www.code31ws.com','google.com','ww.sample.co']

regex = '(w{3}?\.?)?[\w?-]+\.(com|in|edu|co)'
for i in range(len(ips)):
    reg = re.search(regex,ips[i])
    if reg:
        print "true {}".format(i)
    else:
        print "false {}".format(i)

结果:

true 0
true 1
true 2
true 3
true 4

希望它不匹配:

w.stack.in
ww.sample.com

【问题讨论】:

标签: python regex python-2.7


【解决方案1】:

您的正则表达式工作正常。你的问题是你如何使用它。你使用了re.search()。好吧,re 可以在 w.stack.in 中找到匹配项,因为 stack.in 匹配。但是,您想要的是确保 整个字符串 匹配。为此,请使用re.match()。见search() vs. match()。第二种选择是将^ 放在表达式的开头,表示它必须位于字符串的开头。

【讨论】:

    【解决方案2】:

    出现这种情况的原因是因为www 是可选的,search 只需要匹配字符串的一部分,所以它只是匹配其余部分:

    >>> re.search('(w{3}?\.?)?[\w?-]+\.(com|in|edu|co)', 'w.stack.in').group()
    'stack.in'
    

    您可以使用必须匹配整个字符串的match 来修复它:

    >>> re.match('(w{3}?\.?)?[\w?-]+\.(com|in|edu|co)', 'w.stack.in') is None
    True
    

    顺便说一句,我会将第一部分简化为 (www\.)?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      相关资源
      最近更新 更多