【问题标题】:Python Regular expression potential match [duplicate]Python正则表达式潜在匹配[重复]
【发布时间】:2015-05-10 16:13:20
【问题描述】:

我正在使用 re 模块来验证 IP 地址,这是我的模式:

"^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$"

有没有办法在不改变模式的情况下知道字符串是否可以成为潜在匹配项?例如:"127.0.0." 好或 "10.0" 但是 "10.." 不好。我不是指re.match 函数,我想知道一个字符串是否不匹配但它可能是。

我需要一个可以执行以下操作的函数:

import re
p = re.potential("10.0","^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
print p # True

编辑:问题是我想知道我是否可以识别潜在匹配并使用它来限制 wx.TextCtrl 与 wx.EVT_CHAR 事件,我没有询问我的模式.现在我已经这样实现了:

def OnChar(self,event):
    """event validation of ip"""
    key = event.GetKeyCode()
    text_value = event.GetEventObject().GetValue()
    length = len(text_value)
    numbers = True
    point = True

    if length:
        if length>2 and '.' not in text_value[-1:-4:-1]:
            numbers = False
        elif text_value[-1] =='.':
            point=False

    if Keys.is_numeric(key) and numbers:
        event.Skip()

    if Keys.equal(key,'.') and point:
        event.Skip()

    if Keys.is_moves(key):
        event.Skip()

这种方式用户输入的文字不会是不好的东西,但是有没有办法用re模块做到呢?

【问题讨论】:

  • 请注意,您应该使用\. 而不是.,因为它是一个特殊字符。
  • 我将其声明为原始字符串,因此它会忽略所有特殊内容
  • 这是一个特殊的正则表达式字符(如^ 和$),而不是转义字符(如\ )。用127r0h0x0检查一下,你会发现它也通过了

标签: python regex


【解决方案1】:

如果我对您的理解正确,您需要一个匹配的表达式,当某物在某种程度上可以变成一个 IP 地址。只需将部分设为可选:

^(?:\d{1,3}(?:\.\d{1,3}){0,2}(?:\.\d{0,3})?)?$

Demo:这匹配12、234.54、23.53.12.5 和空字符串,但不匹配34.34..4 或3546.34。

编辑:少了嵌套,感谢 Casimir et Hippolyte。

【讨论】:

  • 这正是我的意思。有没有办法用 Python 来做,或者我需要修改我所有的正则表达式?我也有mac地址等等..
  • 你当然可以用 python 来做这个,只要用我的正则表达式代替。
  • 我的意思是不改变模式
  • @ori 这是一个很好的答案。如果您不想更改任何内容,那么为什么要使用正则表达式呢?没有正则表达式,这很容易。
  • 对于 IP 的特殊情况,您也可以用“嵌套较少的方式”来编写它:^\d{1,3}(?:\.\d{1,3}){0,2}(?:\.\d{0,3})?$
【解决方案2】:

您可以使用 re.match as 来做到这一点

>>> if re.match(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", "10.0") :
...     print "Matched"
... else:
...     print "Not Matched"
... 
Not Matched
>>> if re.match(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", "127.0.0.0") :
...     print "Matched"
... else:
...     print "Not Matched"
... 
Matched

注意:re.match 函数对字符串执行整个搜索,因此可以安全地省略锚点 ^ 和 $

【讨论】:

  • 它打印的与我不匹配。
  • @ori 事件127.0.0. 无效,有效ip 必须为127.0.0.0。请参阅编辑后的答案。希望现在很清楚
  • 这不是我需要的,看看编辑
  • @ori:你想要的是一个匹配不完整 IP 地址的模式。没有函数可以返回“字符串是否可以成为潜在匹配”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多