对正则表达式结果执行替换,但仅限于给定条件

时间:2013-01-12 05:01:45

标签: regex musicbrainz

首先,请允许我澄清一下我对正则表达式一无所知,但我需要写一个" Tagger脚本"对于MusicBrainz Picard来说,它并没有弄乱我格式化曲目某些方面的方式。标题。

这是我需要做的事情: - 查找括号内的所有子字符串 - 然后,对于符合给定条件且仅匹配的匹配,将括号更改为括号

例如,考虑这个字符串: DJ Fresh - 大声(Sian Evans)(Flux Pavilion& Doctor P Remix)

需要像这样改变: DJ Fresh - 大声(Sian Evans)[Flux Pavilion&医生P Remix]

条件是如果括号内的字符串包含子字符串" dj"或"混合"或"版本"或"英寸"等...然后围绕它的括号需要更改为括号。

所以,问题是: 是否可以创建一个可以执行此操作的正则表达式?

非常感谢你。

1 个答案:

答案 0 :(得分:3)

假设 没有嵌套括号 ,您可以使用以下正则表达式搜索文本:

(?i)\((?=[^()]*(?:dj|mix|version|inch))([^()]+)\)

请注意,正则表达式不区分大小写,因为前面有(?i) - 通过删除它使区分大小写

检查您的语言的语法,看看您是否可以使用r前缀,例如r'literal_string',指定文字字符串。

并使用以下作为替代:

[$1]

您可以通过向(?:dj|mix|version|inch)部分添加关键字来添加更多关键字,每个关键字由|分隔。如果关键字包含()[]|.+,{{1} },?*^$\{你需要逃避他们(我99%肯定列表是详尽的)。考虑它的一种更简单的方法是:如果关键字仅包含空格和字母数字(但请注意空格的数量是严格的),您可以将它们添加到正则表达式中而不会产生副作用。


解析正则表达式:

  • }不区分大小写模式

  • (?i)\(是正则表达式中的特殊字符,需要通过预先(来转义它。

  • \:积极前瞻(?=[^()]*(?:dj|mix|version|inch))

    • (?=pattern):我需要检查文本是否在括号内,而不在外部或其他括号中,因此我使用否定字符类[^()]*来避免匹配{{1}并溢出当前括号。我所做的假设也在这里发挥作用。

    • [^characters]非捕获组 ()中的关键字列表。 (?:dj|mix|version|inch)表示更改。

  • (?:pattern):关于没有嵌套括号的假设可以更轻松地匹配括号内的所有字符。文本被捕获以供日后替换,因为|正在捕获组,而不是([^()]+)

  • (pattern)(?:pattern)是正则表达式中的特殊字符,需要通过预先\)来转义它。