【问题标题】:How do you return a string found with re.search in python?如何在 python 中返回用 re.search 找到的字符串?
【发布时间】:2016-08-11 21:05:56
【问题描述】:

这是我的代码:

class telnet(object):
    """conexiune"""
    def __init__(self):

        HOST = "route-views.routeviews.org"
        user = "rviews"
        password = ""

        tn = telnetlib.Telnet(HOST)

        tn.read_until("login: ", 5)
        tn.write(user + "\r\n")

        tn.read_until("Password: ", 5)
        tn.write(password + "\r\n")

        print tn.read_until(">", 10)
        tn.write("show ip route 192.0.2.1"+"\r\n")

        self.y = tn.read_until("free", 10)
        print self.y
        tn.write("exit"+ "\r\n")

        tn.close()

    def re(self):
        self.m = re.search(r' Known via "bgp \d{0,5}"', self.y)
        if self.m:
            print self.m.group(0)
        else:
            print False

我需要做的是返回 self.m 而不是打印它。如果我写'return "This answer is:"+self.m',我会得到这个错误:

return "答案是:" + self.m.group(0) TypeError: 无法连接 'str' 和 '_sre.SRE_Match' 对象

如果我使用 print,它会打印它,但我不知道如何使用 return 语句。

这是它必须返回的:

通过“bgp 6447”知道

从此 telnet 输出: 路线视图> 显示 ip 路由 192.0.2.1

192.0.2.1/32 的路由条目

通过“bgp 6447”知道,距离 20,公制 0

标签 19214,输入外部

从 208.74.64.40 4w1d 前的最后更新

路由描述符块:

  • 208.74.64.40,从 208.74.64.40,4w1d 前

    Route metric 为 0,流量份额计数为 1

    AS 啤酒花 1

    路线标签 19214

    MPLS 标签:无

路线视图>

我知道 return 用于函数 - 这就是我添加“+”的原因。顺便说一句,我是 Python 初学者。任何帮助将不胜感激。

【问题讨论】:

  • 您能否发布实际的错误回溯(整个事情)以及您用来生成该回溯的确切代码?您的帖子中有很多不同的变体...print self.m.group(0)return 'the answer is:' + self.mreturn "The answer is: " + self.m.group(0) 等。
  • 这是错误:回溯(最近一次调用最后一次):文件“C:\Users\JohnyB™\Desktop\junk.py”,第 95 行,在 x.re()文件“C:\Users\JohnyB™\Desktop\junk.py”,第 43 行,重新返回“答案是:” + self.m.group(0) TypeError: cannot concatenate 'str' and '_sre.SRE_Match ' 对象如果我输入返回“答案是:”+self.m.group(0) 而不是打印 self.m.group(0),则会出现此错误

标签: python python-2.7 return telnet


【解决方案1】:

来自文档

>>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist")
>>> m.group(0)       # The entire match
'Isaac Newton'
>>> m.group(1)       # The first parenthesized subgroup.
'Isaac'
>>> m.group(2)       # The second parenthesized subgroup.
'Newton'
>>> m.group(1, 2)    # Multiple arguments give us a tuple.
('Isaac', 'Newton')

所以,试试这个

>>> import re
>>> y = ' Known via "bgp 54574"'
>>> m = re.search(r' Known via "bgp (\d{0,5})"', y)
>>> print m.group(1) if m else False
54574
>>> y = ' Known via "bg p 54574"'
>>> m = re.search(r' Known via "bgp (\d{0,5})"', y)
>>> print m.group(1) if m else False
False
>>> 

【讨论】:

  • 你能把它添加到代码中吗?我没有得到你所说的。
  • 我更新了答案。请注意,我还更改了正则表达式以从源字符串中选择数字。
【解决方案2】:

我认为在您的“return”声明中,您只是错过了“.group(0)”。

试试:

if self.m:
   return self.m.group(0)

【讨论】:

  • 当我这样做时它没有显示任何东西,只是 telnet 输出。
  • 好的。正如@Shpionus 在他的回答中所说,您应该返回组(1)。实际上 group(0) 表示 re 找到模式的整个字符串,group(1) 是匹配模式的部分。
  • 是的。如果您要更新正则表达式以指定您要从 self.y 中选择的确切内容,则需要使用 group(1)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2020-08-12
  • 2013-11-23
  • 2021-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多