【问题标题】:How to compare two numbers in a line which are not same in length and print them如何比较一行中长度不同的两个数字并打印它们
【发布时间】:2019-12-05 23:15:19
【问题描述】:

我有一个文件,我必须从中提取包含“TCP 0.0.0.0”的行和正在进行的文本,然后比较它旁边的两个数字,只有当它们的长度不相等时才打印行。

我有下面的代码,它只提取包含“TCP 0.0.0.0”和正在进行的文本的行,但我需要通过比较它旁边的两个数字再次过滤,如果长度不相等则打印:

import re

f = open("log.txt", "r")
counter = 0
print("="*20)
for line in f:
  match = re.search("(TCP 0\.0\.0\.0) (.*) (ongoing)", line)
  if match:
    counter += 1
    print("-"*10)

    # If you want to print the whole line
    print("Count {}:[F] {}".format(counter, line.rstrip()))

    # if you want to print just the matched section
    # print("Count {}:[M] {}".format(counter, match.groups()   [1].rstrip()))

print("="*20)
print("Total Found: {}".format(counter))
f.close()

log.txt:

Dash#07-06-2019 18:04:32 WARNING 240 Anomalies "TCP handshake violation, first packet not syn" TCP 0.0.0.0 0 0.0.0.0 0 15 Regular "policy1" tetet 534049 533799 0 0 N/A low drop FFFFFFFF-FFFF-FFFF-0029-00005CFADC78

Do#07-06-2019 18:04:32 WARNING 240 Anomalies "TCP handshake violation, first packet not syn" TCP 0.0.0.0 0 0.0.0.0 80 15 Regular "policy2" ongoing 77010 76760 0 0 N/A low drop FFFFFFFF-FFFF-FFFF-002A-00005CFADC78

07-06-2019 18:04:37 WARNING 240 Anomalies "TCP handshake violation, first packet not syn" TCP 0.0.0.0 0 0.0.0.0 0 15 Regular "policy1" ongoing 53408 533837 0 0 N/A low drop FFFFFFFF-FFFF-FFFF-0029-00005CFADC78

 07-06-2019 18:04:37 WARNING 240 Anomalies "TCP handshake violation, first packet not syn" TCP 0.0.0.0 0 0.0.0.0 80 15 Regular "policy2" ongoing 770124 76762 0 0 N/A low drop FFFFFFFF-FFFF-FFFF-002A-00005CFADC78

 D#07-06-2019 18:04:42 WARNING 240 Anomalies "TCP handshake violation, first packet not syn" TCP 0.0.0.0 0 0.0.0.0 0 15 Regular "policy1" ongoing 535 533822 0 0 N/A low drop FFFFFFFF-FFFF-FFFF-0029-00005CFADC78

需要从文件中打印以下三行。因为它包含“TCP 0.0.0.0”和正在进行的文本,“53408,533837”的数字长度也不相同(在正在进行的文本前面):

  07-06-2019 18:04:37 WARNING 240 Anomalies "TCP handshake violation, first  packet not syn" TCP 0.0.0.0 0 0.0.0.0 0 15 Regular "policy1" ongoing 53408 533837 0 0 N/A low drop FFFFFFFF-FFFF-FFFF-0029-00005CFADC78

 07-06-2019 18:04:37 WARNING 240 Anomalies "TCP handshake violation, first packet not syn" TCP 0.0.0.0 0 0.0.0.0 80 15 Regular "policy2" ongoing 770124 76762 0 0 N/A low drop FFFFFFFF-FFFF-FFFF-002A-00005CFADC78

 D#07-06-2019 18:04:42 WARNING 240 Anomalies "TCP handshake violation, first packet not syn" TCP 0.0.0.0 0 0.0.0.0 0 15 Regular "policy1" ongoing 535 533822 0 0 N/A low drop FFFFFFFF-FFFF-FFFF-0029-00005CFADC78

【问题讨论】:

  • awk 更适合这种情况。
  • 我是 python 新手,请帮忙
  • 您可以使用split('ongoing')[1] 获取ongoing 之后的所有文本,然后您可以使用split(' ')[0:2] 获取ongoing 之后的两个数字
  • @AlfredE.Noobman 这既错误又无益。
  • @John 您只需要扩展正则表达式,以便它也捕获正在进行的数字:re.search(r"TCP 0\.0\.0\.0 (.+?) ongoing (\d+) (\d+)", line)。现在match.groups() 将返回一个包含您感兴趣的所有元素的元组。

标签: python python-3.x string-matching


【解决方案1】:

您可以使用split('ongoing ')[1] 获取"ongoing" 之后的所有文本,然后您可以使用split(' ')[0:2] 获取"ongoing" 之后的两个数字

import re

data = '''Dash#07-06-2019 18:04:32 WARNING 240 Anomalies "TCP handshake violation, first packet not syn" TCP 0.0.0.0 0 0.0.0.0 0 15 Regular "policy1" tetet 534049 533799 0 0 N/A low drop FFFFFFFF-FFFF-FFFF-0029-00005CFADC78
Do#07-06-2019 18:04:32 WARNING 240 Anomalies "TCP handshake violation, first packet not syn" TCP 0.0.0.0 0 0.0.0.0 80 15 Regular "policy2" ongoing 77010 76760 0 0 N/A low drop FFFFFFFF-FFFF-FFFF-002A-00005CFADC78
07-06-2019 18:04:37 WARNING 240 Anomalies "TCP handshake violation, first packet not syn" TCP 0.0.0.0 0 0.0.0.0 0 15 Regular "policy1" ongoing 53408 533837 0 0 N/A low drop FFFFFFFF-FFFF-FFFF-0029-00005CFADC78
07-06-2019 18:04:37 WARNING 240 Anomalies "TCP handshake violation, first packet not syn" TCP 0.0.0.0 0 0.0.0.0 80 15 Regular "policy2" ongoing 770124 76762 0 0 N/A low drop FFFFFFFF-FFFF-FFFF-002A-00005CFADC78
D#07-06-2019 18:04:42 WARNING 240 Anomalies "TCP handshake violation, first packet not syn" TCP 0.0.0.0 0 0.0.0.0 0 15 Regular "policy1" ongoing 535 533822 0 0 N/A low drop FFFFFFFF-FFFF-FFFF-0029-00005CFADC78
'''

f = data.split('\n')

for line in f:
    match = re.search("(TCP 0\.0\.0\.0) (.*) (ongoing)", line)
    if match:
        second_part = line.split(' ongoing ')[1]
        numbers = second_part.split(' ')[:2]

        number1 = numbers[0]
        number2 = numbers[1]

        print(number1, 'len:', len(number1))
        print(number2, 'len:', len(number2))

        if len(number1) != len(number2):
            print('different lengths')

        print('---')

结果:

77010 len: 5
76760 len: 5
---
53408 len: 5
533837 len: 6
different lengths
---
770124 len: 6
76762 len: 5
different lengths
---
535 len: 3
533822 len: 6
different lengths

编辑:或者您可以创建更复杂的正则表达式来获取数字

re.search("TCP 0\.0\.0\.0 (.*) ongoing (\d+) (\d+)", line)

代码:

import re

data = '''Dash#07-06-2019 18:04:32 WARNING 240 Anomalies "TCP handshake violation, first packet not syn" TCP 0.0.0.0 0 0.0.0.0 0 15 Regular "policy1" tetet 534049 533799 0 0 N/A low drop FFFFFFFF-FFFF-FFFF-0029-00005CFADC78
Do#07-06-2019 18:04:32 WARNING 240 Anomalies "TCP handshake violation, first packet not syn" TCP 0.0.0.0 0 0.0.0.0 80 15 Regular "policy2" ongoing 77010 76760 0 0 N/A low drop FFFFFFFF-FFFF-FFFF-002A-00005CFADC78
07-06-2019 18:04:37 WARNING 240 Anomalies "TCP handshake violation, first packet not syn" TCP 0.0.0.0 0 0.0.0.0 0 15 Regular "policy1" ongoing 53408 533837 0 0 N/A low drop FFFFFFFF-FFFF-FFFF-0029-00005CFADC78
07-06-2019 18:04:37 WARNING 240 Anomalies "TCP handshake violation, first packet not syn" TCP 0.0.0.0 0 0.0.0.0 80 15 Regular "policy2" ongoing 770124 76762 0 0 N/A low drop FFFFFFFF-FFFF-FFFF-002A-00005CFADC78
D#07-06-2019 18:04:42 WARNING 240 Anomalies "TCP handshake violation, first packet not syn" TCP 0.0.0.0 0 0.0.0.0 0 15 Regular "policy1" ongoing 535 533822 0 0 N/A low drop FFFFFFFF-FFFF-FFFF-0029-00005CFADC78
'''

f = data.split('\n')

for line in f:
    match = re.search("TCP 0\.0\.0\.0 (.*) ongoing (\d+) (\d+)", line)
    if match:
        number1 = match.group(2)
        number2 = match.group(3)

        print(number1, 'len:', len(number1))
        print(number2, 'len:', len(number2))

        if len(number1) != len(number2):
            print('different lengths')

        print('---')

【讨论】:

  • 我需要从文件而不是常量(数据)中获取数据
  • 然后使用f = open("log.txt", "r") 而不是f = data.split('\n')。休息将是一样的。我使用数据在没有您的文件的情况下运行它,而我没有它。这个例子每个人都可以在没有你的文件的情况下复制和运行。这是展示工作示例的常用方法。
  • 如果我必须从上面的代码中删除 TCP 0\.0\.0\.0 (.*) 模式并找到解决方案,需要更改哪些代码?
  • 您是否尝试从代码中仅删除 TCP 0\.0\.0\.0 (.*)
  • 可能您必须将group() 中的数字更改为.group(1).group(2)
猜你喜欢
  • 2023-01-11
  • 2015-01-25
  • 2013-04-02
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多