所以我有这段代码来过滤输入字符串中的单词:
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的新手。
答案 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)