正则表达式删除所有标点符号和括号括起来的任何内容

时间:2011-05-26 19:59:08

标签: python regex

我正在尝试从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它们。

4 个答案:

答案 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之后的点处开始匹配,并匹配直到并包括第一个括号:. (。之后,它会再次从括号开始匹配:) [