python在多个正则表达式上运行多行

python在多个正则表达式上运行多行,python,python-3.x,regex,Python,Python 3.x,Regex,我有一个文件夹,需要包含某些文件,其中包含魔术在他们的名字 因此,我有一个包含os.listdir(sstable_dir_path)的所有文件的列表,还有一个正则表达式列表,其中一个正则表达式应该与这些文件名中的一个匹配。 没有嵌套的for,有什么方法可以做到这一点吗 SSTABLE_FILENAMES_REGEXES = [re.compile(r'md-\d+-big-CompressionInfo.db'), re.compile(r'md-\d+-big-Data.db'),

我有一个文件夹,需要包含某些文件,其中包含魔术在他们的名字 因此,我有一个包含os.listdir(sstable_dir_path)的所有文件的列表,还有一个正则表达式列表,其中一个正则表达式应该与这些文件名中的一个匹配。 没有嵌套的for,有什么方法可以做到这一点吗

SSTABLE_FILENAMES_REGEXES = [re.compile(r'md-\d+-big-CompressionInfo.db'), re.compile(r'md-\d+-big-Data.db'),
                             re.compile(r'md-\d+-big-Digest.crc32'), re.compile(r'md-\d+-big-Filter.db'),
                             re.compile(r'md-\d+-big-Index.db'), re.compile(r'md-\d+-big-Statistics.db'),
                             re.compile(r'md-\d+-big-Summary.db'), re.compile(r'md-\d+-big-TOC.txt')]

文件名示例:

md-146-big-CompressionInfo.db
md-146-big-Data.db
md-146-big-Digest.crc32
md-146-big-Filter.db
md-146-big-Index.db
md-146-big-Statistics.db
md-146-big-Summary.db
md-146-big-TOC.txt
我现在是怎么做的

all([any([regex.fullmatch(fillename) for regex in SSTABLE_FILENAMES_REGEXES]) for fillename in os.listdir(sstable_dir_path)])

结果:

['md-146-big-CompressionInfo.db', 'md-146-big-Data.db', 'md-146-big-Digest.crc32', 'md-146-big-Filter.db', 'md-146-big-Index.db', 'md-146-big-Statistics.db', 'md-146-big-Summary.db', 'md-146-big-TOC.txt']

如果您愿意,您可以构建一个格式为
(?=.*^pattern1$)(?=.*^pattern2$)
的正则表达式,
(?=)
是一种积极的前瞻性,
^$
用于模拟“完全匹配”行为

然后,您可以从
os.listdir()
创建一个多行字符串来匹配

SSTABLE_FILENAMES = [
    'big-CompressionInfo.db', 'big-Data.db', 'big-Digest.crc32', 'big-Filter.db',
    'big-Index.db', 'big-Statistics.db', 'big-Summary.db', 'big-TOC.txt'
]

regex = re.compile('(?ms)' + 
    ''.join(f'(?=.*^md-\d+-{re.escape(name)}$)' 
    for name in SSTABLE_FILENAMES)
)

>>> bool(regex.search('\n'.join(os.listdir(sstable_dir_path))))
True

嘿,你可以在正则表达式中使用操作符。正如@BenyGj所指出的,类似这样的东西就是在一个模式上使用
re.compile
一次,其中包含大量的
|
字符。你当前如何做就是如何做(假设你想知道所有正则表达式至少匹配一次)。不过,您可以删除这两套[]。@Karlthorton两套[]是什么意思?使用|确实有帮助,谢谢!我想知道我是否有一个丢失的文件,这种方法不能解决它,但总体思路确实简化了它。谢谢你可以更改列表理解的条件。仍然不起作用,因为你迭代了文件名,所以如果文件不在那里,我就不知道了。谢谢!
SSTABLE_FILENAMES = [
    'big-CompressionInfo.db', 'big-Data.db', 'big-Digest.crc32', 'big-Filter.db',
    'big-Index.db', 'big-Statistics.db', 'big-Summary.db', 'big-TOC.txt'
]

regex = re.compile('(?ms)' + 
    ''.join(f'(?=.*^md-\d+-{re.escape(name)}$)' 
    for name in SSTABLE_FILENAMES)
)

>>> bool(regex.search('\n'.join(os.listdir(sstable_dir_path))))
True