regex 使用Python3匹配列表中的文件的正则表达式

xxls0lw8  于 2023-02-25  发布在  Python
关注(0)|答案(4)|浏览(144)

任务:我需要匹配所有文件从temp开始,并应结束.txt从列表中。我已经尝试了这段代码,但它不工作。

import re

pattern = re.compile(r'^temp(?:_[\d]{2}[\W_])*(\d{4})?(?:[\W_][\d]{2}[\W_][\d]{2})?\.txt$')

file_names = [
    'temp_2023_05_22.txt',
    'temp.txt',
    'temp_09_05_2022.txt',
    'temp_22092023.txt'
]

matched_files = [file_name for file_name in file_names if pattern.match(file_name)]
print(matched_files)

Edited也考虑这种情况

temp20230522.txt
fzsnzjdm

fzsnzjdm1#

查看您的模式和示例数据:

^temp(?:_(?:\d{4}_\d\d_\d\d|\d\d(_?)\d\d\1\d{4}))?\.txt$
    • 说明**
  • ^字符串开始
  • temp逐字匹配
  • (?:非夺获组
  • _逐字匹配
  • (?:备选项的非捕获组
  • \d{4}_\d\d_\d\d匹配4位数_ 2位数_ 2位数
  • |
  • \d\d(_?)\d\d\1\d{4}匹配2个数字,捕获组1中的可选_,2个数字,使用反向引用和4个数字匹配与组1中相同的字符
  • )关闭非捕获组
  • )?关闭非捕获组并将其设为可选
  • 匹配'. txt
  • $字符串结束

参见regex101 demo
或者更广泛的匹配:

^temp(?:_\d+_?\d+_?\d+)?\.txt$

查看其他regex101 demo

kx5bkwkv

kx5bkwkv2#

刚刚写了下面的简单正则表达式,它涵盖了所有情况下,你提到的,加上一些与字母数字名称有下划线:

import re

pattern = re.compile("temp(_|[0-9]|[a-zA-Z])*.txt")

file_names = [
    'temp_2023_05_22.txt',
    'temp.txt',
    'temp_09_05_2022.txt',
    'temp_22092023.txt'
]

matched_files = [file_name for file_name in file_names if pattern.match(file_name)]
print(matched_files)

输出:

['temp_2023_05_22.txt', 'temp.txt', 'temp_09_05_2022.txt', 'temp_22092023.txt']
kokeuurv

kokeuurv3#

由于您有一个直接和简单的比较,这可能是更简单和更明显的没有正则表达式

[name for name in file_names if name.startswith("temp") and name.endswith(".txt")]

不必要的外来变异
x一个一个一个一个x一个一个二个x

yfjy0ee7

yfjy0ee74#

您正在使用的正则表达式模式似乎过于具体,可能不匹配所有以“temp”开头并以“.txt”结尾的文件名。

import re

pattern = re.compile(r'^temp.*\.txt$')

file_names = [
    'temp_2023_05_22.txt',
    'temp.txt',
    'temp_09_05_2022.txt',
    'temp_22092023.txt'
]

matched_files = [file_name for file_name in file_names if pattern.match(file_name)]
print(matched_files)

相关问题