Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式删除所有标点符号和括号内的任何内容_Python_Regex - Fatal编程技术网

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

Python 正则表达式删除所有标点符号和括号内的任何内容,python,regex,Python,Regex,我试图删除python中字符串中的所有标点符号以及括号或括号内的任何内容。这样做的目的是在查询MusicBrainz Web服务时对歌曲名称进行某种程度的规范化,以获得更好的结果 样本输入:T.N.T.live[纽约州] 预期产量:T 我可以在两个正则表达式中完成,但我想看看是否可以在一个正则表达式中完成。我尝试了以下方法,但没有成功 >>> re.sub(r'\[.*?\]|\(.*?\)|\W+', ' ', 'T.N.T. (live) [nyc]') 'T N T li

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

样本输入:T.N.T.live[纽约州]

预期产量:T

我可以在两个正则表达式中完成,但我想看看是否可以在一个正则表达式中完成。我尝试了以下方法,但没有成功

>>> re.sub(r'\[.*?\]|\(.*?\)|\W+', ' ', 'T.N.T. (live) [nyc]')
'T N T live nyc '
如果我将\W+拆分为它自己的正则表达式,然后再运行它,我会得到预期的结果,因此似乎\W+在前两个选项可以处理它们之前就吃了大括号和括号

\W

未指定区域设置和UNICODE标志时,匹配任何非字母数字字符;这相当于集合[^a-zA-Z0-9]

因此,请尝试r'\[.\]\..*.{.*.}.[^a-zA-Z0-9.[\]{}]+'

不过,安德鲁的解决方案可能更好

\W

未指定区域设置和UNICODE标志时,匹配任何非字母数字字符;这相当于集合[^a-zA-Z0-9]

因此,请尝试r'\[.\]\..*.{.*.}.[^a-zA-Z0-9.[\]{}]+'

不过,Andrew的解决方案可能更好。

因为它有一个运行:它从第二个T之后的点开始匹配,直到并包括第一个括号:。在这之后,它再次开始从一个括号到另一个括号进行匹配:[.

因为它有一个运行:它在第二个T之后的点开始匹配,并继续匹配,直到并包括第一个括号:…之后,它再次从一个括号到另一个括号进行匹配:[。

如果您认为\W+正在吃牙套,请移除+并设置:

>>> re.sub(r'\[.*?\]|\(.*?\)|\W', ' ', 'T.N.T. (live) [nyc]')
'T N T     '
如果您认为\W+正在吃大括号是正确的,请删除+并设置:

>>> re.sub(r'\[.*?\]|\(.*?\)|\W', ' ', 'T.N.T. (live) [nyc]')
'T N 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)

这是一个小型解析器,它与我作为练习编写的一样。如果您的规范化工作变得更加复杂,您可以开始研究基于解析器的解决方案。这就像一个小型解析器一样工作

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

您是否担心不匹配的括号,或者可能作为原始标题的一部分的同一类型的多个括号?例如,输入T.N.T.live应该live stay?以及T.N.T.live X nyc应该X stay?在这一点上,我不担心不匹配或嵌套的括号。我认为它们可能不会经常出现,导致一个大问题。你是否担心不匹配的括号,或者可能作为原始标题的一部分的同一类型的多个括号?例如,输入T.N.T.live应该live stay?和T.N.T.live X nyc应该X stay?在这一点上,我不担心不匹配或嵌套的括号。我认为它们可能不会经常出现在虽然会引起一个大问题。作为旁注,string.letters='abcdefghijklmnopqrstuvwxyzabefghijklmnopqrstuvxyz'。所以导入string并保存一些键入内容。作为旁注,string.letters='abcdefghijklmnopqrstuvxyzabdfghijklmnopqrstuvxyz'。所以导入string并保存一些键入内容。