查找偶数行中不存在特定正则表达式的文件

Find files that don't exist a specific regex in even lines

提问人:Pubg Mobile 提问时间:7/27/2023 最后编辑:Wiktor StribiżewPubg Mobile 更新时间:7/28/2023 访问量:39

问:

我的目录中有大量的 txt 文件,文件必须具有如下列表的格式:E:\Desktop\social\Output_folder

Botelt
2,006,910
Classtertmates
932,977
SiretexDettegrees
740,025
PlantrthyhetAll
410,810
theGkykyulobe
316,409
NOVEMBER
1997

这意味着文件必须具有以下特征:

  1. 只有奇数行必须包含字母。
  2. 偶数行必须仅包含前正则表达式:^.*?(?<!\d)(?<!\d,)(\d{1,3}(?:,\d{3})*)(?!,?\d).*
  3. 最新的非空行必须仅包含 4 位数字,例如 2020 或 2014(年份格式)
  4. 我的多个正则表达式行不能连续放置。
  5. 不能连续放置多个字母行。

现在我需要一个正则表达式来查找目录中没有上述特征的文件。例如,以下列表: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,802560,492,43051,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.")

但是我的脚本不起作用并报告我所有文件名。
我的脚本问题出在哪里?

Python 字符串 解析

评论

0赞 9769953 7/27/2023
“我的多个正则表达式行不能连续放置”:这是什么意思?你能举一些例子吗?
2赞 9769953 7/27/2023
^.*?(?<!\d)(?<!\d,)(\d{1,3}(?:,\d{3})*)(?!,?\d).*是一个看起来很可怕的模式。你能用语言解释一下规则#2是什么吗?
0赞 Pubg Mobile 7/27/2023
@9769953该正则表达式用于记事本++
0赞 Pubg Mobile 7/27/2023
@9769953我的意思是与正则表达式匹配的行
0赞 InSync 7/27/2023
@9769953有关上下文,请参阅此问题

答:

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公司