如何从parens中删除所有内容,除非它包含给定的关键字

时间:2017-08-19 14:46:43

标签: python regex python-3.x

所以我有这段代码来过滤输入字符串中的单词:

RemoveWords = "\\b(official|videoclip|clip|video|mix|ft|feat|music|HQ|version|HD|original|extended|unextended|vs|preview|meets|anthem|12\"|4k|audio|rmx|lyrics|lyric|international|1080p)\\b"
result = re.compile(RemoveWords, re.I)

这是一种解决方法,因为我刚开始使用Python。 现在最理想的是:

  

如果parens包含“remix”或“edit”字样:请勿删除文字   在parens内。否则从parens删除所有内容,包括   parens本身。

例如,如果标题如下所示:

  

AC / DC - T.N.T. (来自River Plate的Live)

必须删除parens之间的所有内容。

但如果标题看起来像这样:

  

AC / DC - T.N.T. (Dj Example Remix)

不要删除parens之间的文本,因为它包含单词remix。

我知道如何删除与正则表达式匹配的单词,但我不知道如何在parens之间保留它,或者如果它不包含给定的单词,如何删除它之间的所有内容。

我一直试着查看正则表达式以找出如何在parens之间进行限制,但我无法理解它,因为我也是Regex的新手。

2 个答案:

答案 0 :(得分:1)

你可以试试这个:

import re


keep_words = ["remix", "edit"]

s = "AC/DC - T.N.T. (Dj Example Remix)"

words = [i.lower() for i in s[s.index("(")+1:s.index(")")].split()]

new_s = re.sub("\((.*?)\)", "", s) if  not any(i in keep_words for i in words) else s

输出:

AC/DC - T.N.T. (Dj Example Remix)

在这种情况下,代码将保留括号,因为它们之间的单词出现在stop_words中。但是,如果s = "AC/DC - T.N.T. (from Live at River Plate)",则输出将为:

AC/DC - T.N.T. 

说明:

对于此解决方案,算法在括号之间找到内容并将其拆分。然后,代码将所有值转换为该新列表中存在的小写。正则表达式的工作方式如下:

"\(" => escape character: finding the first parenthesis in the string
"(.*?)" => matches all the content between specific strings, in this case the outside parenthesis: \( and \)
"\)" => last parenthesis. It must be escaped by the backslash so that it will not be confused for the command to search between specific tags

如果找到匹配项并且在括号之间找不到keep_words中的任何项目,则正则表达式将删除括号之间的所有数据并用空字符串替换它:""

答案 1 :(得分:1)

使用re.finditer()re.search()函数的解决方案:

import re
titles = 'AC/DC - T.N.T. (from Live at River Plate) AC/DC - T.N.T. (Dj Example Remix)'
result = titles

for m in re.finditer(r'\([^()]+\)', titles):
    if not re.search(r'\b(remix|edit)\b', m.group(), re.I):
        result = re.sub(re.escape(m.group()), '', result)

print(result)

输出:

AC/DC - T.N.T.  AC/DC - T.N.T. (Dj Example Remix)