繁体   English   中英

正则表达式:有没有办法忽略字符串中的特定字符集并仍然匹配?

[英]RegEx: Is there a way to ignore a specific set of characters in a string and still match?

假设我有一些按艺术家姓名组织(很差)的音乐文件,例如:

/data/myfolder/Jay Z/some_file1.mp3
/data/myfolder/Jay-Z/some_file2.mp3
/data/myfolder/JayZ/some_file3.mp3
/data/myfolder/Destiny's Child/some_file4.mp3
/data/myfolder/Destinys Child/some_file5.mp3

我想使用正则表达式匹配运行一些批处理操作。 但是,在查找我的匹配项时,我想忽略艺术家姓名中的特殊字符。 我可以用 python 以编程方式替换特殊字符,但我想知道它是否可以完全用正则表达式模式来完成。

例如,以下代码仅适用于当前编写的some_file1.mp3some_file4.mp3

import os
import re

artists = ["Jay Z", "Destiny's Child"]
root = "/data/myfolder/"

for filepath in os.listdir(root):
    for artist in artists:
        pattern = r"\/data\/myfolder\/{}\/.*.mp3".format(artist)
        match = re.search(pattern, filepath)

        if match:
            ...do some stuff...
           

有没有办法从/\/data\/myfolder\/{}\/.*.mp3.format(artist)修改我的正则表达式模式,以便即使有破折号、单引号或其他指定字符串中的特殊字符? 基本上,在寻找匹配项时,我试图忽略字符串中任何位置存在的某些字符。

首先,您for filepath in os.listdir(root)的 for 文件路径返回root内的子文件夹列表,但不返回其中的文件。 您需要使用os.walk

for dirpath, dirnames, filenames in os.walk(root):
    if not dirnames:
        for filename in filenames:
            filepath = os.path.join(dirpath, filename)

现在,如果您想使用一个忽略您选择的任何字符在用作正则表达式一部分的某个固定字符串中的正则表达式,您只能尝试PyPi 正则表达式的模糊匹配功能。 这个想法是从artists项目中删除所有被忽略的字符,然后允许在艺术家子文件夹部分中插入任意数量的这些字符。

参见 Python 代码:

import regex, os
artists = ["Jay Z", "Destiny's Child"]
artists = [regex.sub(r"[',. -]+", "", s) for s in artists]
root = r'/data/myfolder'

        
for dirpath, dirnames, filenames in os.walk(root):
    if not dirnames:
        for filename in filenames:
            filepath = os.path.join(dirpath, filename)
            for artist in artists:
                pattern = r"{}[\\/](?:{}){{i:[',. -]}}[\\/][^\\/]*\.mp3$".format(regex.escape(root), artist)
                match = regex.search(pattern, filepath)
                if match:
                    print(match.group())

注意[\\/]用于匹配 Windows 和 Linux 文件夹分隔符。 我还在忽略的字符列表中添加了一个空格。

artists = [regex.sub(r"[',. -]+", "", s) for s in artists]是从artists子文件夹名称中删除忽略字符的准备步骤。

正则表达式看起来像/data/myfolder[\\/](?:DestinysChild){i:[',. -]}[\\/][^\\/]*\.mp3$ /data/myfolder[\\/](?:DestinysChild){i:[',. -]}[\\/][^\\/]*\.mp3$

  • /data/myfolder - 文字根部分
  • [\\/] - 一个/\字符
  • (?:DestinysChild){i:[',. -]} (?:DestinysChild){i:[',. -]} - 包含任意数量空格、撇号、连字符、点或逗号插入的DestinyChild字符串
  • [\\/] - 一个/\字符
  • [^\\/]* - 除/\之外的零个或多个字符
  • \.mp3$ - 字符串末尾的.mp3
pattern = re.compile("/data/myfolder/.*[^/]/.*.mp3")

尝试这样做。

把它放在括号[{}]+

pattern = r"\/data\/myfolder\/[{}]+\/.*.mp3".format(artist)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM