[英]Python regex - extracting directories from path
我有關於正則表達式/ Python的問題。 很抱歉,如果這個主題已被討論了數百萬次 - 通常我會在so / google等上找到答案但是我被這個問題困在數百萬的答案中......(說實話 - 我擁有一本正則表達式的書,但不知何故我太傻了,真的不明白......)
對於音樂管理系統,我需要從路徑中提取信息,提供不同的選項集。 這里有兩個例子:
"/The Prodigy/The Fat Of The Land/04 - Funky Stuff.flac"
它應該提取:
"/[XLR 483] The Fat Of The Land/04 - The Prodigy - The Funky Stuff.flac"
應提取:
不需要涵蓋兩種情況的正則表達式,這只是兩個例子。 然后我將它們作為選項提供(或者添加自己的選項)。
任何幫助將不勝感激!
@ 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()
(其中file1
和file2
是您上面給出的路徑)。
第一件事:用括號捕獲正則表達式匹配的東西。 因此,下面括號之間的所有內容都將作為匹配中的項目吐出。
第二:除了正斜杠之外的任何東西都匹配正則代碼,如[^/]
。 所以要在正斜杠之間匹配很多東西,你可以做[^/]*
。
把它們放在一起,在第一個字符串中捕獲藝術家,你做/([^/]*)/
。 然后你再次這樣做以獲得釋放。
第三:匹配任何數字,使用[0-9]
。 因此,要匹配任何數字字符串,請使用[0-9]*
。
反復應用這些原則,你應該能夠理解上述內容。
以下是我解決問題的方法。
如果您有任何具體的疑問,請寫正則表達式,編輯您的問題並遵循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'
它可能看起來有點復雜,但我已經逃脫了所有模棱兩可的角色,所以基本上,模式如下:
^
在開始 /?
最多可以有一個斜線/
后跟...... [
大括號 ([^\\]]+)
包含除了一個或多個結束大括號以外的所有+
(並請,使用分組括號捕獲值)和 ]
右大括號,然后 (.*)
任何東西,但換行(0次或多次*
)經由括號捕獲 /
。 希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.