正则表达式匹配域名

时间:2016-08-21 01:59:29

标签: python regex

^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$

我尝试了上面的代码,但无论多么丑陋都无法与任何域匹配。

我尝试仅将字段与单词匹配,并以.com

结尾
Like 
google.com
yahoo.com
bing.com

Not 
google.net
google.con
googl-e.com

3 个答案:

答案 0 :(得分:1)

-[a-z0-9]+群组的目的是什么?我得到了你的六个测试用例:

import re
r = re.compile("^([a-z0-9]+\.)com$")

# Like
assert r.match('google.com')
assert r.match('yahoo.com')
assert r.match('bing.com')

# Not 
assert not r.match('google.net')
assert not r.match('google.con')
assert not r.match('googl-e.com')

答案 1 :(得分:0)

您的代码与之匹配,因为它使用匹配字符串开头和结尾的^$。要使其与行的开头和结尾匹配,您必须启用多行选项re.M。另外,使用re.I使其不区分大小写,我相信域名是。

根据您的要求:

  1. .com
  2. 结束
  3. 没有破折号
  4. 没有数字
  5. <强>代码

    import re
    regex = re.compile(r'^[a-z]+\.com$' , re.M | re.I)
    
    print(regex.findall("""\
    google.com
    yahoo.com
    bing.com
    google.net
    google.con
    googl-e.com
    """))
    
    # => ['google.com', 'yahoo.com', 'bing.com']
    

    要将其分解:

    ^        # To mark the start of line/string
    [a-z]+   # One or more alphabet
    \.       # match the `.` character
    com      # match the `com` string
    

答案 2 :(得分:-1)

我经常遇到$的问题,所以我在^之后和$运算符之前添加\ s *来检测前导/尾随分隔符。如果不了解背景,就无法推理太多。

^\s*([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}\s*$