【问题标题】:python run multiple lines on multiple regexpython在多个正则表达式上运行多行
【发布时间】:2021-04-07 14:32:40
【问题描述】:

我有一个文件夹需要包含某些名称中包含魔法的文件 所以我有一个包含 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)])

【问题讨论】:

  • 嘿,您可以在正则表达式中使用运算符 OR。
  • 正如@BenyGj 所说,this 之类的东西只需在您的单个模式上使用一次re.compile,其中包含大量| 字符。
  • @KarlThornton 两组 [] 是什么意思?使用 |确实有帮助,谢谢!

标签: python python-3.x regex


【解决方案1】:

如果您愿意,您可以构建一个格式为 (?=.*^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

【讨论】:

    【解决方案2】:
    files = ['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']
    pattern = '|'.join(map(lambda x: x.pattern, SSTABLE_FILENAMES_REGEXES))
    res = [fillename for fillename in files.split() if re.fullmatch(pattern=pattern , string=fillename) ]
    
    print(res)
    
    

    结果:

    ['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']
    

    【讨论】:

    • 我想知道我是否有丢失的文件,这种方式并不能解决问题,但总体思路确实简化了谢谢
    • 你可以改变列表理解的条件。
    • 仍然无法工作,因为您遍历文件名,所以如果文件不存在,我不会知道它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    相关资源
    最近更新 更多