提问人:Pubg Mobile 提问时间:7/27/2023 最后编辑:Wiktor StribiżewPubg Mobile 更新时间:7/28/2023 访问量:39
查找偶数行中不存在特定正则表达式的文件
Find files that don't exist a specific regex in even lines
问:
我的目录中有大量的 txt 文件,文件必须具有如下列表的格式:E:\Desktop\social\Output_folder
Botelt
2,006,910
Classtertmates
932,977
SiretexDettegrees
740,025
PlantrthyhetAll
410,810
theGkykyulobe
316,409
NOVEMBER
1997
这意味着文件必须具有以下特征:
- 只有奇数行必须包含字母。
- 偶数行必须仅包含前正则表达式:
^.*?(?<!\d)(?<!\d,)(\d{1,3}(?:,\d{3})*)(?!,?\d).*
- 最新的非空行必须仅包含 4 位数字,例如 2020 或 2014(年份格式)
- 我的多个正则表达式行不能连续放置。
- 不能连续放置多个字母行。
现在我需要一个正则表达式来查找目录中没有上述特征的文件。例如,以下列表:E:\Desktop\social\Output_folder
QrtQrt
316,935,269
Frtaceertbrtortok
220,138,444
Reertdertdertit
113,759,355
YourtretTrtuertbete
87,035,728
Tatjjuygguked
85,739,300
MyshtyhSpyrtyactye
81,000,349
Ftyryriendttyysteyr
71,734,802
560,492,430
51,682,046
Tutymrtybrtylr
51,245,350
Crtyltyatrysrtysmarytetys
41,314,645
Tjyozytonyje
38
VtyyjKyjontyjaktyje
29,011,910
JUNE
2009
如果你看上面的例子,和 和 是连续的。71,734,802
560,492,430
51,682,046
我编写了以下 python 脚本,该脚本必须检查我的目录文件并查找具有错误特征的文件:
import os
import re
def is_valid_line(line, is_even):
if is_even:
return re.match(r'^.*?(?<!\d)(?<!\d,)(\d{1,3}(?:,\d{3})*)(?!,?\d).*$', line)
else:
return re.match(r'^[A-Z]', line)
def is_valid_file(file_path):
with open(file_path, 'r') as file:
lines = file.readlines()
if len(lines) % 2 == 0:
return False
for i, line in enumerate(lines):
is_even = i % 2 == 0
if not is_valid_line(line.strip(), is_even):
return False
# Check if the last line is a four-digit number
last_line = lines[-1].strip()
if not re.match(r'^\d{4}$', last_line):
return False
return True
def find_invalid_files(directory_path):
invalid_files = []
for file_name in os.listdir(directory_path):
if file_name.endswith('.txt'):
file_path = os.path.join(directory_path, file_name)
if not is_valid_file(file_path):
invalid_files.append(file_name)
return invalid_files
if __name__ == "__main__":
directory_path = r"E:\Desktop\social\Output_folder"
invalid_files = find_invalid_files(directory_path)
report_file = "invalid_files_report.txt"
with open(report_file, "w") as f:
if invalid_files:
f.write("The following files do not follow the specified format:\n")
for file_name in invalid_files:
f.write(file_name + "\n")
else:
f.write("All files in the directory follow the specified format.\n")
print("Report generated. Check 'invalid_files_report.txt' for details.")
但是我的脚本不起作用并报告我所有文件名。
我的脚本问题出在哪里?
答:
1赞
9769953
7/27/2023
#1
^.*?(?<!\d)(?<!\d,)(\d{1,3}(?:,\d{3})*)(?!,?\d).*
从不匹配四位数字 (*),因此最后一行将始终失败。
您需要避免使用此模式测试最后一行。例如,使用
for i, line in enumerate(lines[:-1]):
(*) 从试用。我无法很好地解析该模式,无法解释为什么它不适用于四位数的数字。
评论
0赞
9769953
7/27/2023
是的,在此之前,您还需要在循环中测试最后一行是否有其他模式。
0赞
Pubg Mobile
7/27/2023
对于正则表达式,我可以使用:^.*?(?<!\d)(?<!\d,)(\d{1,3}(?:,\d{3})*)(?!,?\d).*|^\d{4}$
0赞
9769953
7/27/2023
好吧,如果您找到更清晰的解决方案,请继续。上述解决方案也有效。
0赞
Pubg Mobile
7/27/2023
我写了另一个脚本并再次测试。TNQ公司
评论
^.*?(?<!\d)(?<!\d,)(\d{1,3}(?:,\d{3})*)(?!,?\d).*
是一个看起来很可怕的模式。你能用语言解释一下规则#2是什么吗?