【问题标题】:print string after keyword python在关键字python之后打印字符串
【发布时间】:2014-06-25 16:02:45
【问题描述】:

我设法从 txt 文件中提取以下行

05/19/2014, 15:24:14.455> LVL:2 RC:   0          SERVER :server main: TERA_MGMT_SYS_SESS_EVENT_RESET with disconnect cause (0x105)

现在如何从中取出105

#!/usr/bin/env python
import sys, re, os

lineContains = re.compile(r'(?=.*disconnect cause)')
lineContainsCode = re.compile(r'cause\s*\(.*?(\d+)\)')
filename = open ("pcoip_server_2014_05_19_00000560.txt", 'r')

for line in filename:
    if lineContains.match(line):
        print 'The file has: '
        print line
        code = lineContainsCode.search(line).group(1)
        print 'The code is:', code
        if code == 001:
            print 'PCoIP session terminated due to lost network.'
        elif code == 100:
            print 'PCoIP connection not established due to failure of PCoIP server initialization. This should not occur. Please contact Teradici support.'
        elif code == 101:
            print 'PCoIP connection not established due to failure of PCoIP server initialization. This should not occur in normal operation. Note: If the Welcome Screen is enable in the View Administrator a ConnectionTicketTimeout will trigger a disconnect after 15 min with this code'
        elif code == 102:
            print 'PCoIP session terminated due to VMware View Connection Server (broker) maximum session duration (Connection Server setting) exceeded.'
        elif code == 103:
            print 'PCoIP session terminated due to the VDI user selecting Logoff or Restart from Windows in the VDI session'
        elif code == 104:
            print 'PCoIP session terminated due to admin manually disconnected the session from the Administrative Web Interface.'
        elif code == 105:
            print 'PCoIP session terminated due to login from an alternate location OR Pre-connection warmup initialization of PCoIP Server. This is not for actual connection. If the size of the log is under 15 Kbytes, this is a pre-connection warmup startup/shutdown sequence.'
        elif code == 200:
            print 'PCoIP session terminated due to the user right-clicking the host driver icon in the tray and then selecting Menu > Disconnect. Applicable only to clients connecting to a hard host and not VDI.'
        elif code == 201:
            print 'PCoIP connection not established due to incompatible host driver version (not used for VDI).'
        elif code == 300:
            print 'PCoIP session terminated due to the user closing the View Client window or due to the user ending the View application task inside the Windows Task Manager'
        elif code == 301:
            print 'PCoIP session terminated due to the user clicking the zero client\'s Disconnect button. Not applicable for soft clients.'
        elif code == 302:
            print 'PCoIP session terminated due to the user clicking the Disconnect button in the client Administrative Web Interface. Not applicable for soft clients.'
        elif code == 303:
            print 'The VMware View Connection Server (broker) requested the session to end.'
        elif code == 304:
            print 'PCoIP session terminated due to Power Sleep disconnect (not used for VDI).'
        elif code == 305:
            print 'PCoIP session terminated due to user pulling out the smart card used for user authentication.'
        elif code == 306:
            print 'PCoIP session terminated due to user taking action specified by OneSign to be a disconnect command (for example, double tapping the card).'
        elif code == 400:
            print 'Zero client and View 4.5 and earlier: PCoIP session terminated due to network issues on TCP/SSL connection (keepalive ping timeout).'
        elif code == 401:
            print 'PCoIP connection not established due to networking issues or failure to open drivers, such as video, audio, or USB.'
        elif code == 402:
            print 'PCoIP connection not established due to networking issues.'
        elif code == 403:
            print 'PCoIP session terminated due to various reasons. For example, network lost or client/server crash.'
        elif code == 404:
            print 'PCoIP connection not established due to inability to use the VMware video driver on the server.'
        elif code == 405:
            print 'PCoIP connection not established due to client and server not having a common encryption method enabled.'
        elif code == 406:
            print 'Zero Client and View 4.5 and earlier: PCoIP session terminated due to network issues on TCP/SSL connection. Zero client and View 4.6 (and later). This is normal operation since the TCP/SSL connection is terminated right after session negotiation.'
        elif code == 407:
            print 'PCoIP connection not established due to the View Security Server detecting that AES encryption is disabled on either the client and/or server.'
        else:
            print 'code not found in KB.'

filename.close()

给我错误 文件“pcoip_disconnect_codes.py”,第 20 行 elif 代码 == 102: ^ IndentationError: unindent 不匹配任何外部缩进级别

【问题讨论】:

    标签: python regex string file


    【解决方案1】:

    您可以尝试以下正则表达式来获取 () 括号内的数字。下面的正则表达式包含字符串 cause,因为它有助于正确匹配确切的行以及 () 中的数字。

    cause \(.*?(\d+)\)
    

    DEMO

    你的代码是,

    lineContainsCode = re.compile(r'cause \(.*?(\d+)\)')
    

    【讨论】:

    • 'code = lineContainsCode.search(line).group(1) print code if code == '150': { print ('see kb') }' 尝试使用 if but似乎不起作用并给我错误提示:文件“pcoip_disconnect_codes.py”,第17行打印('see kb')^ SyntaxError:无效语法@Rakesh KR
    【解决方案2】:

    对于非正则表达式方法:

    code = line.split("(")[-1].split(")")[0].split("x")[-1]
    # more readable:
    # code = line.split("(")[-1]
    #            .split(")")[0]
    #            .split("x")[-1]
    

    这将拆分所有文字开放括号上的字符串,并在-1 上建立索引(即抓住最后一个)。然后在所有文字关闭括号上拆分它,并在0 上进行索引(即抓住第一个),然后在所有文字上拆分"x"s 并在-1 上建立索引(即抓住最后一个)

    KEY: ---- items not selected
         ++++ items selected
           |  split point (NOT SELECTED)
    
    1.
    05/19/2014, 15:24:14.455> LVL:2 RC:   0          SERVER :server main: TERA_MGMT_SYS_SESS_EVENT_RESET with disconnect cause (0x105)
    ---------------------------------------------------------------------------------------------------------------------------|++++++
    
    2.
    0x105)
    +++++|--
    
    3.
    0x105
    -|+++
    

    导致105

    编辑哈希图示例:

    code = lineContainsCode.search(line).group(1)
    hashmap = {"001":'PCoIP session terminated due to lost network.',
               "100":'PCoIP connection not established due to failure of PCoIP server initialization. This should not occur. Please contact Teradici support.',           
                ...
               "407":'PCoIP connection not established due to the View Security Server detecting that AES encryption is disabled on either the client and/or server.'}
    error_msg = hashmap.get(code,'code not found in KB.')
    print(error_msg)
    

    【讨论】:

    • 我用了这个,它打印出 0x105,有什么办法可以拉出 105。我真的很不擅长,你介意把它分解或解释一下吗请@Adam Smith
    • 'code = lineContainsCode.search(line).group(1) print code if code == '150': { print ('see kb') }' 尝试使用 if but似乎不起作用并给我错误提示:文件“pcoip_disconnect_codes.py”,第 17 行打印('see kb')^ SyntaxError: invalid syntax
    • @user3731311 你写python多久了?不要使用花括号来表示代码块......
    • 不会太久,我也试过删除{}。获得代码后,我尝试了 'if code == 150: print 'use this'' 似乎不起作用@Adam Smith 谢谢你的帮助
    • @user3731311 没有看到你的完整代码很难说 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    相关资源
    最近更新 更多