正则表达式去除所有标点符号和括号内的内容
我想在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+
在前两个选项处理之前就把括号和圆括号给处理掉了。
4 个回答
0
\W+
会把括号也算进去,因为它“有连续的匹配”:它从第二个 T 后面的点开始匹配,一直匹配到并包括第一个括号:. (
。之后,它又从一个括号开始匹配到下一个括号:) [
。
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)
4
你说得对,\W+
这个表达式会把大括号也给吃掉。只要把+
去掉就可以了:
>>> re.sub(r'\[.*?\]|\(.*?\)|\W', ' ', 'T.N.T. (live) [nyc]')
'T N T '