簡體   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