删除包含python中特定单词/字符串的文本文件中的整行

删除包含python中特定单词/字符串的文本文件中的整行,python,string,split,extract,Python,String,Split,Extract,全部。 我正在使用SO中的示例,试图删除文本文件中的几行/字符串,但没有成功。例如,需要删除的字符串行 OSPF Process 1 with Router ID 1.1.1.1 Area: 0.0.0.11 Link State Database 我可以通过精确地指定整个字符串/行来删除这些行,如下所示,但一次只能删除一行,另一个问题是路由器ID和区域可以是任意数字并动态更改 filen

全部。 我正在使用SO中的示例,试图删除文本文件中的几行/字符串,但没有成功。例如,需要删除的字符串行

             OSPF Process 1 with Router ID 1.1.1.1
                       Area: 0.0.0.11
               Link State Database  
我可以通过精确地指定整个字符串/行来删除这些行,如下所示,但一次只能删除一行,另一个问题是路由器ID和区域可以是任意数字并动态更改

filename = 'raw.txt'
with open(filename, 'r') as fin:
    lines = fin.readlines()
with open('clean.txt', 'w') as fout:
    for line in lines:
        if 'Area: 0.0.0.10' not in line:
            fout.write(line)
我尝试使用startwith,但它没有删除它

if not line.startswith('OSPF'):
这是文本文件中字符串的外观和放置方式。OSPF…,区域…,链接。。。线条不是从左边开始的,而是从空白开始的,所以我认为这就是为什么startswith不起作用的原因


     OSPF Process 1 with Router ID 1.1.1.1
                 Area: 0.0.0.11
         Link State Database 


some textxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

         OSPF Process 1 with Router ID 2.1.1.1
                 Area: 0.0.0.12
         Link State Database 

some textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


     OSPF Process 1 with Router ID 2.2.2.2
                 Area: 0.0.0.33
         Link State Database 

some textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
删除这些行后,预期如下所示

some textxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


some textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


some textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
请进一步建议,谢谢

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


     OSPF Process 1 with Router ID 1.1.1.1
                 Area: 0.0.0.11
         Link State Database 


例如,执行脚本时超过5行。它将删除3行,但仍保留2行

另一个例子

 * Link ID: 10.1.155.20
     Data   : 255.255.255.252
     Link Type: StubNet
     Metric : 1
     Priority : Low
                         Area: 0.0.0.13
                 Link State Database


  Type      : Router
  Ls id     : 1.4.0.2
  Adv rtr   : 1.4.0.2
这有4行(介于区域和类型之前)…当执行脚本时,只有2行删除…和2行保留。。。。 为了这个。。。决赛应该如下所示

* Link ID: 10.1.155.20
     Data   : 255.255.255.252
     Link Type: StubNet
     Metric : 1
     Priority : Low

  Type      : Router
  Ls id     : 1.4.0.2
  Adv rtr   : 1.4.0.2
删除特定的字符串和行以及下一行(链接状态数据库行之后)

clean.txt

**To remove this empty line
To remove this empty line
To remove this empty line**
  Type      : Router
  Ls id     : 1.4.0.1
  Adv rtr   : 1.4.0.1
  Ls age    : 996
  Len       : 48
  Options   :  ASBR  E
  seq#      : 8000002f
  chksum    : 0xe7f5
  Link count: 2
   * Link ID: 1.16.9.9
     Data   : 10.1.155.2
     Link Type: P-2-P
     Metric : 100
   * Link ID: 10.1.155.20
     Data   : 255.255.255.252
     Link Type: StubNet
     Metric : 100
     Priority : Low

  Type      : Router
  Ls id     : 1.16.9.9
  Adv rtr   : 1.16.9.9
  Ls age    : 392
  Len       : 48
  Options   :  ABR  E
  seq#      : 8000001e
  chksum    : 0x3116
  Link count: 2
   * Link ID: 1.4.0.1
     Data   : 10.242.177.21
     Link Type: P-2-P
     Metric : 1
   * Link ID: 10.1.155.20
     Data   : 255.255.255.252
     Link Type: StubNet
     Metric : 1
     Priority : Low
**To remove this empty line**

  Type      : Router
  Ls id     : 1.4.0.2
  Adv rtr   : 1.4.0.2
  Ls age    : 1194
  Len       : 96
  Options   :  ASBR  E
  seq#      : 8001cf7b
  chksum    : 0xbfae
  Link count: 6
   * Link ID: 1.4.0.2
     Data   : 255.255.255.255
     Link Type: StubNet
     Metric : 0
     Priority : Medium
   * Link ID: 1.4.0.1
     Data   : 10.0.0.2
     Link Type: P-2-P
     Metric : 10
   * Link ID: 10.0.0.0
     Data   : 255.255.255.252
     Link Type: StubNet
     Metric : 10
     Priority : Low
   * Link ID: 10.40.8.0
     Data   : 255.255.255.252
     Link Type: StubNet
     Metric : 100
     Priority : Low
   * Link ID: 19.23.23.15
     Data   : 10.40.10.130
     Link Type: P-2-P
     Metric : 10
   * Link ID: 1.4.10.200
     Data   : 255.255.255.252
     Link Type: StubNet
     Metric : 10
     Priority : Low
To remove this empty line

  Type      : Router
  Ls id     : 100.100.0.10
  Adv rtr   : 100.100.0.10
  Ls age    : 171
  Len       : 84
  Options   :  ASBR  E
  seq#      : 8001a292
  chksum    : 0x5fa2
  Link count: 5
   * Link ID: 100.100.0.10
     Data   : 255.255.255.255
     Link Type: StubNet
     Metric : 12
     Priority : Medium
   * Link ID: 10.10.0.1
     Data   : 10.10.10.18
     Link Type: P-2-P
     Metric : 10
   * Link ID: 10.10.10.17
     Data   : 255.255.255.255
     Link Type: StubNet
     Metric : 10
     Priority : Medium
   * Link ID: 19.23.23.15
     Data   : 10.10.30.30
     Link Type: P-2-P
     Metric : 10
   * Link ID: 10.90.25.30
     Data   : 255.255.255.255
     Link Type: StubNet
     Metric : 10
     Priority : Medium

  Type      : Router
  Ls id     : 10.10.0.1
  Adv rtr   : 10.10.0.1
  Ls age    : 191
  Len       : 96
  Options   :  ASBR  E
  seq#      : 80013bcf
  chksum    : 0x9871
  Link count: 6
   * Link ID: 10.10.0.1
     Data   : 255.255.255.255
     Link Type: StubNet
     Metric : 12
     Priority : Medium
   * Link ID: 15.51.51.14
     Data   : 10.10.0.130
     Link Type: P-2-P
     Metric : 10
   * Link ID: 10.10.0.129
     Data   : 255.255.255.255
     Link Type: StubNet
     Metric : 10
     Priority : Medium
   * Link ID: 100.100.0.10
     Data   : 10.10.10.17
     Link Type: P-2-P
     Metric : 10
   * Link ID: 10.10.10.18
     Data   : 255.255.255.255
     Link Type: StubNet
     Metric : 10
     Priority : Medium
   * Link ID: 16.16.16.0
     Data   : 255.255.255.252
     Link Type: StubNet
     Metric : 10
     Priority : Low

  Type      : Router
  Ls id     : 15.51.51.14
  Adv rtr   : 15.51.51.14
  Ls age    : 2487
  Len       : 60
  Options   :  ASBR  ABR  E
  seq#      : 8000003c
  chksum    : 0x1714
  Link count: 3
   * Link ID: 10.242.95.12
     Data   : 255.255.255.252
     Link Type: StubNet
     Metric : 1
     Priority : Low
   * Link ID: 10.10.0.1
     Data   : 10.10.0.129
     Link Type: P-2-P
     Metric : 1
   * Link ID: 10.10.0.128
     Data   : 255.255.255.252
     Link Type: StubNet
     Metric : 1
     Priority : Low
**To remove this empty line
To remove this empty line**
请注意,该行不是以
OSPF
开头,而是以一堆空格开头,然后是OSPF。首先尝试
去除
行。另外,
startswith
可以获取一组可能的前缀,因此您可以一次性检查所有前缀

for line in lines:
    if not line.strip().startswith(("OSPF", "Area", "Link State")):
        fout.write(line)
请注意,如果实际文本中的某些行也以
Area
或类似开头,则此操作可能会失败

您还可以使用正则表达式确保行必须以一些空格开头,然后是其中一个关键字:

import re
for line in lines:
    if not re.match(r"\s+(Area|OSPF|Link State)", line):
        fout.write(line)

可以使用正则表达式查找某些特定文本并将其删除。下面是示例代码,您可以根据需要使用不同的正则表达式

请尝试以下代码:

import re
regex = "OSPF|Area|Link"
for line in lines:
    if not re.findall(regex, line):
        print line

您可以不逐行读取,而是读取文本文件的全部内容,并使用特定匹配的模式,同时考虑可能变化的数字部分

^[ \t]*OSPF Process \d+ with Router ID \d+(?:\.\d+){3}\s*Area: \d+(?:\.\d+){3}\s*Link State Database\s*(?:\n|$)
解释

  • ^
    字符串的开头
  • [\t]*
    将空格或制表符的0+倍匹配
  • OSPF进程\d+和路由器ID\d+(?:\。\d+{3}
    匹配文本,考虑进程和路由器ID的数字格式
    \d+
  • \s*区域:\d+(?:\。\d+{3}
    匹配
    区域:
    后跟1+位,并对点和1+位重复3次
  • \s*链接状态数据库
    匹配0+倍的空白字符和文字
  • \s*(?:\n |$)
    匹配0+倍的空白字符,然后匹配换行符或断言字符串的结尾
|

例如:

import re

filename = 'raw.txt'
pattern = r"^[ \t]*OSPF Process \d+ with Router ID \d+(?:\.\d+){3}\s*Area: \d+(?:\.\d+){3}\s*Link State Database\s*(?:\n|$)"
with open(filename, 'r') as fin:
    res = re.sub(pattern, "", fin.read(), 0, re.MULTILINE)
    text_file = open("clean.txt", "w")
    text_file.write(res)
    text_file.close()
编辑

要在后匹配空换行符,可以使用“在后添加”数据库:

  • [\t]*
    匹配空格或字符串的0+倍
  • (?:
    非捕获组
    • (?:\r?\n |\r)[\t]*
      匹配换行符,然后匹配0+次制表符或空格
  • )?
    关闭非捕获组并将其设置为可选
  • $
    断言字符串的结尾
完整模式:

^[ \t]*OSPF Process \d+ with Router ID \d+(?:\.\d+){3}\s*Area: \d+(?:\.\d+){3}\s*Link State Database[ \t]*(?:(?:\r?\n|\r)[ \t]*)?$

所以你想保留的行都有一个非空格字符作为行中的第一个字符?@AndrewAllen不是真的先生。有些我需要保留的行也有空格,但与我想删除的行不太一样。我需要小心…这样它只会删除特定的行…另一件事是哪一行是有效使用的先生开始使用或重新。。。。thanks@chenoi我认为效率在这里不是问题。您可以扩展正则表达式,例如,以抽象方式包含“Area”的值,那么它肯定只会匹配那些行。您好,先生……我已经测试过了,它可以工作……但是当我使用clean.txt和另一个脚本时,它运行正常,但不知怎的,我也得到了空值……对于这个解决方案,它可以工作。谢谢您,先生。由于空行出现这种情况……需要删除(1)顶部空行(2)底部空行和(3)删除任何2条空行,以便仅为1Hi先生。。。。删除这些行时,它还将创建新的单行。在执行上述脚本时,是否可以不创建新行?谢谢,先生……这项工作……但当我将clean.txt传递给另一个脚本读取(以提取特定的字符串和行)时,我遇到了错误。。但是为了删除空白和指定字符串,它确实可以工作。Thanks@chenoi不客气。如果任何给定的答案解决了你的问题,你可以考虑点击。✓ 在它的左边,您认为是有帮助的。您好,先生,它确实会根据需要删除..我如何扩展它以同时删除/删除它后面的行..我的意思是删除行链接状态数据库下面的行。。。因此…移除OSPF线…区域线。。。链接状态的行…和它下面的一行。。。thanks@chenoi如果要在匹配可选空行后删除一行,可以使用路由器ID\d+(?:\。\d+{3}\s*区域:\d+(?:\。\d+){3}\s*链接状态数据库[\t]*(?:(?::\r?\n\r)[\t]*)(?:(?:\r?\n\r)[\t]*)$