Python正则表达式 - 从路径中提取目录

时间:2012-02-13 22:07:11

标签: python regex path extraction

我对regex / Python有疑问。很抱歉,如果这个主题已被讨论了数百万次 - 通常我会在so / google等上找到答案但是我被这个问题困在数百万的答案中......(说实话 - 我拥有一本正则表达式的书,但不知何故我太傻了,真的无法理解......)

对于音乐管理系统,我需要从路径中提取信息,提供不同的选项集。这里有两个例子:

如果路径是:(案例1)

"/The Prodigy/The Fat Of The Land/04 - Funky Stuff.flac"
它应该提取:
  • 艺术家:“The Prodigy”
  • 发布:“肥沃的土地”
  • 跟踪编号:4
  • 标题:“Funky Stuff”

例如:(案例2)

"/[XLR 483] The Fat Of The Land/04 - The Prodigy - The  Funky Stuff.flac"
应提取:
  • catno:“XLR 483”
  • 发布:“肥沃的土地”
  • 跟踪编号:4
  • 艺术家:“The Prodigy”
  • 标题:“Funky Stuff”

不需要涵盖这两种情况的正则表达式,这只是两个例子。然后我会将它们作为选项提供(或者添加自己的选项)。

非常感谢任何帮助!

@ S.Lott:我没有这方面的正则表达式,我开始拆分字符串:

parts = rel_path.split('/')       
track = parts[-1]
release = parts[-2]
artist = parts[-3]

但这对我来说似乎是一种非常不灵活且不优雅的解决方案。

编辑:

到目前为止,我有类似的内容:

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')

4 个答案:

答案 0 :(得分:6)

虽然没有必要,但重新是这个问题的方便选择。

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,你不需要一本书。

答案 1 :(得分:2)

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]*

反复应用这些原则,你应该能够理解上述内容。

答案 2 :(得分:0)

以下是我解决问题的方法。

  1. 分割路径,检查是否为len 4(第一种情况)或3(第二种情况)。
  2. 忽略应该是单个'/'的第一个元素,对于第二个元素,对其进行操作以提取[xxx]。
  3. 在最后一个元素上按“ - ”拆分以获取其他信息。
  4. 如果您有任何具体的疑问,请写正则表达式,编辑您的问题并遵循S.Lott的建议。

答案 3 :(得分:0)

您应该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. 和尾部斜杠/
  8. 希望这有帮助!