正则表达式去除所有标点符号和括号内的内容

1 投票
4 回答
4213 浏览
提问于 2025-04-16 18:25

我想在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     '

撰写回答