我对regex / 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:我没有这方面的正则表达式,我开始拆分字符串:
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')
答案 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()
(其中file1
和file2
是您在上面提供的路径。)
第一件事:用括号捕获正则表达式匹配的东西。因此,下面的括号之间的所有内容都将作为匹配中的项目吐出。
第二:除了正向斜线之外的任何东西都匹配[^/]
这样的正则表达式代码。因此,要在正斜杠之间匹配大量内容,请执行[^/]*
。
将这些组合在一起,以便在第一个字符串中捕捉艺术家,你可以/([^/]*)/
。然后你再次这样做以获得释放。
第三:要匹配任何数字,请使用[0-9]
。因此,要匹配任何数字字符串,请使用[0-9]*
。
反复应用这些原则,你应该能够理解上述内容。
答案 2 :(得分:0)
以下是我解决问题的方法。
如果您有任何具体的疑问,请写正则表达式,编辑您的问题并遵循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'
这可能看起来有点复杂,但我已经逃脱了所有暧昧的角色,所以基本上,模式如下:
^
开头/?
最多可以有一个斜杠/
,后跟...... [
大括号([^\]]+)
包含除了一个或多个结束大括号之外的所有+
(并且,请使用分组括号捕获值)和]
结束大括号后跟(.*)
除了通过括号捕获的换行符(0次或更多次*
)之外的任何内容/
。希望这有帮助!