【问题标题】:regexp to match an IP address in python [duplicate]正则表达式匹配python中的IP地址[重复]
【发布时间】:2015-10-26 09:38:58
【问题描述】:

我写了下面的正则表达式来匹配IP地址,

x = 'IP is 200.185.24.24'
y = re.findall('([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-2][0-3])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-5][0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-5][0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-5][0-5])',x)

我得到以下答案,

>>> y
[('200', '185', '24', '2')]

我有两个问题,

  1. 为什么我的桅杆八位字节在这里失败。休息很好。
  2. 当您看到上面的模式时,我重复了相同的操作以匹配 IP 地址的第 2、3 和第 4 个八位字节。有没有一种简单的方法来表示这种重复的模式。我猜 tcl 中的 \d 是为了重复(不确定)。我在 python 中寻找类似的东西。

感谢您的投入。

【问题讨论】:

标签: python regex


【解决方案1】:

将正则表达式中存在的所有捕获组转换为非捕获组。而且最好使用单词边界,否则您必须反转模式,例如(?:large-pattern|medium-pattern|small-pattern)

y = re.findall('\b(?:[1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-2][0-3])\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-5][0-5])\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-5][0-5])\.(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-5][0-5])\b',x)

您获得上述输出主要是因为re.findall 函数优先考虑组而不是匹配项。如果没有组,则优先匹配。

【讨论】:

  • 谢谢阿维纳什。我试过你的,但返回一个空列表,>>> x = 'IP is 200.185.24.24' >>> y = re.findall('\b(?:[1-9]|[1-9][ 0-9]|1[0-9][0-9]|2[0-2][0-3])\.(?:[0-9]|[1-9][0-9] |1[0-9][0-9]|2[0-5][0-5])\.(?:[0-9]|[1-9][0-9]|1[0 -9][0-9]|2[0-5][0-5])\.(?:[0-9]|[1-9][0-9]|1[0-9][ 0-9]|2[0-5][0-5])\b',x) >>> >>> y [] ........ 欣赏您的意见。
猜你喜欢
  • 2014-05-17
  • 1970-01-01
  • 2012-04-27
  • 2011-05-12
  • 2022-12-07
  • 2011-08-17
  • 2011-08-27
  • 2012-05-17
  • 2011-03-01
相关资源
最近更新 更多