【问题标题】:python filter lines matching keyworkspython过滤行匹配keyworks
【发布时间】:2019-07-13 08:56:01
【问题描述】:

我有工作 python 脚本产生以下输出。

import re
import sys
import socket
conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conn.connect(('10.10.10.10', 25001))
conn.send('status\n')
data = conn.recv(16777216)
conn.close()
print data

脚本输出

session 3594154272 xwf9VgJQfRSSPBCyXYVRzlw==foo xh_iUVQ6JRieFv70JjDVOnQ==bar 13584
stream 102.22.133.12:33562 173.24.54.19:39814 10.10.10.10:12838 39382628/29008576/68391204 
session 3363219694 xiXdeg8oGTQ6MYZ-Z5q4iKw==foo xVBsa0nlZT4-vOLA8P-WxSw==bar 2319
stream 71.22.223.192:43718 115.125.65.61:41126 10.10.10.10:12802 4243204/9624660/13867864
....
....
.... 

现在我想要在输出中以stream 开头的任何行,所以我使用以下逻辑但它不起作用。

import re
import sys
import socket
conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conn.connect(('10.10.10.10', 25001))
conn.send('status\n')
data = conn.recv(16777216)
conn.close()

# parse line contain stream
for line in data:
    if re.match(r'stream', line):
        print line,

【问题讨论】:

  • 为什么不if line.startswith('stream '):
  • 只是if line.startswith('stream '): print line 是@anubhava 所指的。这是一个string method.(我假设这是 python 2.7 从它的外观。)
  • 您的datastring,而不是stringslist。使用for line in data.split('\n'):
  • for n, line in enumerate(data.split('\n')):,其中ntotal 行的增量(不仅仅是匹配的行)。如果您只想计算匹配的行,请在循环之前执行count = 0,并在每个if 块中执行count += 1
  • 太棒了!!它有效..请发布答案,以便我可以投票回答。感谢@anubhava 的提示

标签: python regex linux scripting


【解决方案1】:

您的data 是一个巨大的string,而不是您预期的stringslist。此外,使用str.startswith 而不是正则表达式更容易(更少的资源消耗)。只需按如下方式更改您的代码:

# parse line contain stream
for n, line in enumerate(data.split('\n')):
    if line.startswith('stream '):
        print line

其中n 是您的data 中的 行数。如果你只想统计你遇到"stream"的具体次数:

count = 0
for line in data.split('\n'):
    if line.startswith('stream '):
        print line
        count += 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-15
    • 2020-01-27
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 2014-11-25
    • 2022-01-18
    相关资源
    最近更新 更多