python - 删除文本文件中包含python中特定单词/字符串的整行
问题描述
全部。我使用 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
删除特定的字符串和行及其下一行(在链接状态数据库行之后)
干净的.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**
解决方案
您可能会做的不是逐行阅读,而是阅读文本文件的全部内容,并为该特定匹配使用一种模式,将可能变化的数字部分考虑在内。
^[ \t]*OSPF Process \d+ with Router ID \d+(?:\.\d+){3}\s*Area: \d+(?:\.\d+){3}\s*Link State Database\s*(?:\n|$)
解释
^
字符串的开始[ \t]*
匹配 0+ 次空格或制表符OSPF Process \d+ with Router ID \d+(?:\.\d+){3}
匹配文本,考虑\d+
进程和路由器 ID的数字格式\s*Area: \d+(?:\.\d+){3}
匹配Area:
后跟 1+ 位数字并重复 3 次点和 1+ 位数字\s*Link State Database
匹配 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()
编辑
要匹配之后的空换行符,您可以在数据库之后使用 add:
[ \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]*)?$
推荐阅读
- java - 如何优化使用嵌套 for 循环的代码?
- ranorex - 如何在 Ranorex 中使用全局变量?
- python - 如何将字节添加在一起并根据python中的校验和验证它们
- mysql - 查询“归属”的sql代码是什么?
- android - android数据绑定错误运行时/编译器
- guidewire - 戈苏(导线)
- python - Python pocketsphinx 0.1.15 配置与 pocketsphinx_continuous.exe 配置
- typescript - 如何在打字稿编译构建中包含自定义类型/命名空间
- javascript - 鼠标滚轮平滑滚动滚动条问题
- python - Python/matplotlib:如何更改绘图中每个第 n 个数据点的颜色和/或符号?