簡體   English   中英

Python正則表達式 - 從路徑中提取目錄

[英]Python regex - extracting directories from path

我有關於正則表達式/ Python的問題。 很抱歉,如果這個主題已被討論了數百萬次 - 通常我會在so / google等上找到答案但是我被這個問題困在數百萬的答案中......(說實話 - 我擁有一本正則表達式的書,但不知何故我太傻了,真的不明白......)

對於音樂管理系統,我需要從路徑中提取信息,提供不同的選項集。 這里有兩個例子:

如果路徑是:(案例1)

"/The Prodigy/The Fat Of The Land/04 - Funky Stuff.flac"
它應該提取:
  • 藝術家:“The Prodigy”
  • 釋放:“土地的肥肉”
  • 跟蹤編號:4
  • 標題:“時髦的東西”

例如:(案例2)

 "/[XLR 483] The Fat Of The Land/04 - The Prodigy - The Funky Stuff.flac" 
應提取:
  • catno:“XLR 483”
  • 釋放:“土地的肥肉”
  • 跟蹤編號:4
  • 藝術家:“The Prodigy”
  • 標題:“時髦的東西”

不需要涵蓋兩種情況的正則表達式,這只是兩個例子。 然后我將它們作為選項提供(或者添加自己的選項)。

任何幫助將不勝感激!

@ S.Lott:我沒有這方面的正則表達式,我開始分割字符串:

pattern = re.compile('^/(?P<artist>[a-zA-Z0-9 ]+)/(?P<release>[a-zA-Z0-9 ]+)/(?P<track>[a-zA-Z0-9 -_]+).[a-zA-Z]*.*')


rel_path = '/The Prodigy/The Fat Of The Land/04 - Funky Stuff.flac'

match = pattern.search(rel_path)

artist = match.group('artist')
release = match.group('release')
track = match.group('track')

但這對我來說似乎是一種非常不靈活和不優雅的解決方案。

編輯:

到目前為止我有類似的東西:

 pattern = re.compile('^/(?P<artist>[a-zA-Z0-9 ]+)/(?P<release>[a-zA-Z0-9 ]+)/(?P<track>[a-zA-Z0-9 -_]+).[a-zA-Z]*.*') rel_path = '/The Prodigy/The Fat Of The Land/04 - Funky Stuff.flac' match = pattern.search(rel_path) artist = match.group('artist') release = match.group('release') track = match.group('track') 

雖然沒有必要,但重新是這個問題的方便選擇。

import re
pattern = re.compile(r"/(?P<artist>[a-zA-Z0-9 ]+?)/(?P<release>[a-zA-Z0-9 ]+?)/(?P<tracknumber>\d+?) - (?P<title>[a-zA-Z0-9 ]+?).flac")
s = "/The Prodigy/The Fat Of The Land/04 - Funky Stuff.flac"
m = pattern.search(s)
print m.group('artist')
print m.group('release')
print m.group('track number')
print m.group('title')

我使用諸如[a-zA-Z0-9 ]表達式來明確指定字符串中我期望的字符。 我喜歡使用類似白名單的正則表達式來使代碼更安全。 還有許多其他方法可以構成等效模式。 你會在這里找到你需要的所有http://docs.python.org/library/re.html ,你不需要一本書。

pattern1 = re.compile(r'/([^/]*)/([^/]*)/([0-9]*) - (.*)\.[^.]*')
artist,release,Tracknumber,Title = pattern1.match(file1).groups()

pattern2 = re.compile(r'/\[([^]]*)\] ([^/]*)/([0-9]*) - (.*) - (.*)\.[^.]*')
catno,release,Tracknumber,artist,Title = pattern2.match(file2).groups()

(其中file1file2是您上面給出的路徑)。

第一件事:用括號捕獲正則表達式匹配的東西。 因此,下面括號之間的所有內容都將作為匹配中的項目吐出。

第二:除了正斜杠之外的任何東西都匹配正則代碼,如[^/] 所以要在正斜杠之間匹配很多東西,你可以做[^/]*

把它們放在一起,在第一個字符串中捕獲藝術家,你做/([^/]*)/ 然后你再次這樣做以獲得釋放。

第三:匹配任何數字,使用[0-9] 因此,要匹配任何數字字符串,請使用[0-9]*

反復應用這些原則,你應該能夠理解上述內容。

以下是我解決問題的方法。

  1. 做一個路徑分割,並檢查是否是len 4(第一種情況)或3(第二種情況)。
  2. 忽略應該是單個'/'的第一個元素,對於第二個元素,對其進行操作以提取[xxx]。
  3. 在最后一個元素上按“ - ”拆分以獲取其他信息。

如果您有任何具體的疑問,請寫正則表達式,編輯您的問題並遵循S.Lott的建議。

你應該首先使用/ delimiter split ,這樣你就可以獲得與split返回的數組大小相關的信息。

然后,如果需要,您可以使用正則表達式。 例如,在第二種情況下:(只有當你有兩個元素時才會發生這種情況?)

import re
item = "/[XLR 483] The Fat Of The Land/04 - The Prodigy - The  Funky Stuff.flac"
matches = re.search('^\/?\[([^\]]+)](.*)\/', item)
print matches.group(1) # 'XLR 483'
print matches.group(2) # ' The Fat Of The Land'

它可能看起來有點復雜,但我已經逃脫了所有模棱兩可的角色,所以基本上,模式如下:

  1. ^在開始
  2. /? 最多可以有一個斜線/后跟......
  3. [大括號
  4. ([^\\]]+)包含除了一個或多個結束大括號以外的所有+ (並請,使用分組括號捕獲值)和
  5. ]右大括號,然后
  6. (.*)任何東西,但換行(0次或多次* )經由括號捕獲
  7. 並且斜杠/

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM