检测所有未用大括号括起来的模板表达式

2024-09-30 00:24:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个这样的模板字符串:

'%album_artist%/%album%{ (%year%)}/{%track_number%. }%track_artist% - %title%'

我想找到所有变量,这些变量不是可选的,因此没有用大括号括起来:track_artisttitlealbum_artist和{},而不是track_number和{}。在

目前,我的表达式是'(?<![{])%([A-Za-z_]+)%(?![}])',但它也匹配year。在

为了使正则表达式不被变量名周围的附加字符或大括号内的多个变量混淆,我需要做些什么更改?在

我使用Python的re。在

相关问题:


Tags: to字符串模板numberalbumtitleartist表达式
2条回答

您可以尝试使用交替,只对不匹配大括号的分支进行分组。它将返回带空白字符串的结果,您可以筛选出这些字符串,例如:

>>> import re
>>> s = r'''%album_artist%/%album%{ (%year%)}/{%track_number%. }%track_artist% - %title%'''
>>> list(filter(lambda e: e.strip(), re.findall(r'\{[^}]*\}|%([^%]*)%', s)))
['album_artist', 'album', 'track_artist', 'title']

如果使用PHP,可以使用以下模式:

~{[^}]*+}(*SKIP)(*FAIL)|%\w++%~i

示例:

^{pr2}$

如果使用Python,则可以使用一个捕获组执行相同的操作(即:在前面匹配花括号中的内容,然后搜索要查找的内容):

import re

mystr = r'%album_artist%/%album%{ (%year%)}/{%track_number%. }%track_artist% - %title%';
print filter(bool, re.findall(r'{[^}]*|(?i)%(\w+)%', mystr))

通知:

您可以尝试另一种模式,它将在左大括号后的最后一个%停止匹配(不能确定它比第一个快):

print filter(bool, re.findall(r'{(?:[^}%]*%)*|(?i)%(\w+)%', mystr))

相关问题 更多 >

    热门问题