Regex删除所有标点和括号中的任何内容

2024-05-21 03:01:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从python中的字符串中删除所有标点符号和括号或括号内的任何内容。这样做的目的是在查询musicbrainzwebservice时对歌曲名称进行某种程度的规范化,以获得更好的结果。在

示例输入: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。在


Tags: 方法字符串目的relive示例内容选项
3条回答

正确的是\W+正在吃掉大括号,请删除{},并应设置:

>>> re.sub(r'\[.*?\]|\(.*?\)|\W', ' ', 'T.N.T. (live) [nyc]')
'T N T     '

\W+会吃掉方括号,因为它“有一个运行”:它从第二个T之后的点开始匹配,直到并包括第一个括号:. (。之后,它将重新开始从一个括号到另一个括号的匹配:) [。在

这里有一个小解析器,它做的事情和我在练习中写的一样。如果规范化的工作变得更加复杂,那么您可以开始研究基于解析器的解决方案。这就像一个小解析器。在

# 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)

相关问题 更多 >