【问题标题】:Recognizing valid IP addresses having 2 or 3 components识别具有 2 或 3 个组件的有效 IP 地址
【发布时间】:2015-03-04 12:44:04
【问题描述】:

我遇到了正则表达式的问题。我的意图是如果字符串包含类似于域的内容(它应该是包含由点分隔的 2 或 3 个单位的字符串),则返回 True。 我写了这样的模式:

pattern = r'([a-z]+(\.[a-z]+){1,2})'

如果字符串有 2 或 3 个部分也没关系,但如果出现较长的示例,例如

“www.haha.bla.pl”

我认为{1,2} 会成功,但事实并非如此。请给我一些建议。

【问题讨论】:

  • 你的输入格式是什么?你保证每行只有一个吗?输入中是否还有其他文本日志类型的内容?
  • 只有这样的东西: self.assertFalse(is_domain_name("www.haha.bla.pl")) self.assertTrue(is_domain_name("foo.tv")) self.assertTrue(is_domain_name("bla .pl")) self.assertFalse(is_domain_name("bla1.pl")) self.assertTrue(is_domain_name("www.bla.pl")) self.assertFalse(is_domain_name("foo..tv")) self.assertTrue (is_domain_name("zz")) self.assertTrue(is_domain_name("xyz")) self.assertFalse(is_domain_name("foo.pl."))

标签: python regex ip-address


【解决方案1】:

你不一定需要regex,例如你可以计算split的长度

def matches(s):
    return len(s.split('.')) > 2

或使用count

def matches(s):
    return s.count('.') >= 2

要处理'.'字符之间的空字符串,你可以在split之后filter

def matches(s):
    return len(list(filter(bool, s.split('.')))) > 2

>>> matches('12.34.67.98')
True
>>> matches('foo....tv')
False
>>> matches('12.345')
False

【讨论】:

    【解决方案2】:

    好吧如果你保证点永远不会相邻,或者组件是空的,你可以简单地计算点,然后比较1<= s.count('.') <= 2

    s = "aa.bb.cc.dd"
    s.count('.')
    # 3
    

    【讨论】:

    • 此解决方案不安全,即使s = "..." 不是有效域,它也会返回 3。
    • @MarounMaroun 您没有阅读条件 “如果您保证点从不相邻” 吗?显然它只有在这种情况下才有效。
    • 我错过了,既然你已经加粗了,我不能错过它:) 但它仍然不安全,因为它可以匹配 s = ".2.3.2"
    • 好的,“如果组件从不为空”。你明白了。我的观点只是“如果你能通过简单的字符串操作就不要使用正则表达式”。
    • 确实,在不需要时避免使用正则表达式是一个很好的建议。
    猜你喜欢
    • 2021-12-13
    • 1970-01-01
    • 2016-12-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 2012-01-31
    • 1970-01-01
    相关资源
    最近更新 更多