我正在尝试从python中的字符串中删除所有标点符号和括号或括号内的任何内容。我的想法是在查询MusicBrainz WebService时稍微规范歌曲名称以获得更好的结果。
示例输入:T.N.T. (live) [nyc]
预期输出:T N T
我可以在两个正则表达式中完成,但我想看看它是否可以只用一个。我尝试了以下,但没有用......
>>> re.sub(r'\[.*?\]|\(.*?\)|\W+', ' ', 'T.N.T. (live) [nyc]')
'T N T live nyc '
如果我将\W+
拆分为自己的正则表达式然后再运行它,我会得到预期的结果,所以看起来\W+
在前两个选项可以处理之前正在吃括号和parens它们。
答案 0 :(得分:3)
你是正确的\W+
正在吃大括号,删除+
你应该设置:
>>> re.sub(r'\[.*?\]|\(.*?\)|\W', ' ', 'T.N.T. (live) [nyc]')
'T N T '
答案 1 :(得分:1)
这是一个迷你解析器,它做了我作为练习写的相同的东西。如果您的规范化工作变得更加复杂,您可能会开始研究基于解析器的解决方案。这就像一个小小的解析器。
# Remove all non-word chars and anything between parens or brackets
def consume(I):
I = iter(I)
lookbehind = None
def killuntil(returnchar):
while True:
ch = I.next()
if ch == returnchar:
return
for i in I:
if i in 'abcdefghijklmnopqrstuvwyzABCDEFGHIJKLMNOPQRSTUVWXYZ':
yield i
lookbehind = i
elif not i.strip() and lookbehind != ' ':
yield ' '
lookbehind = ' '
elif i == '(':
killuntil(')')
elif i == '[':
killuntil(']')
elif lookbehind != ' ':
lookbehind = ' '
yield ' '
s = "T.N.T. (live) [nyc]"
c = consume(s)
答案 2 :(得分:0)
\ W
未指定LOCALE和UNICODE标志时,匹配任何非字母数字字符;这相当于集[^ a-zA-Z0-9 _]。
请尝试r'\[.*?\]|\(.*?\)|{.*?}|[^a-zA-Z0-9_()[\]{}]+'
。
安德鲁的解决方案可能更好。
答案 3 :(得分:0)
\W+
吃括号,因为它“有一个运行”:它在第二个T之后的点处开始匹配,并匹配直到并包括第一个括号:. (
。之后,它会再次从括号开始匹配:) [
。