从字符串中剥离大括号内的最后一个文本

时间:2018-03-08 22:29:56

标签: python regex python-3.x

我想知道如何在字符串中删除最后一次出现的()及其内容。

以下代码删除字符串中的所有()。

bracketedString     = '*AWL* (GREATER) MINDS LIMITED (CLOSED)'
nonBracketedString  = re.sub("\s\(.*?\)", '', bracketedString)
print(nonBracketedString1)

我想要以下输出。

*AWL* (GREATER) MINDS LIMITED

2 个答案:

答案 0 :(得分:5)

您可以仅删除字符串末尾带有前导空格的(...)子字符串:

\s*\([^()]*\)$

请参阅regex demo

<强>详情

  • \s* - 0+空白字符
  • \( - (
  • [^()]* - 除()
  • 以外的0个字符
  • \) - )
  • $ - 字符串结束。

请参阅Python demo

import re
bracketedString     = '*AWL* (GREATER) MINDS LIMITED (CLOSED)'
nonBracketedString  = re.sub(r"\s*\([^()]*\)$", '', bracketedString)
print(nonBracketedString) # => *AWL* (GREATER) MINDS LIMITED

使用PyPi正则表达式模块,您还可以删除字符串末尾的嵌套括号:

import regex
s = "*AWL* (GREATER) MINDS LIMITED (CLOSED(Jan))" # => *AWL* (GREATER) MINDS LIMITED
res = regex.sub(r'\s*(\((?>[^()]+|(?1))*\))$', '', s)
print(res)

请参阅Python demo

<强>详情

  • \s* - 0+ whitespaces
  • (\((?>[^()]+|(?1))*\)) - 第1组:
    • \( - (
    • (?>[^()]+|(?1))* - 除了()或整个第1组模式之外,重复0次或多次1个字符
    • \) - )
  • $ - 字符串结束。

答案 1 :(得分:1)

如果你想替换最后一个括号,即使它们不在字符串的末尾:

*AWL* (GREATER) MINDS LIMITED (CLOSED) END

您可以使用tempered greedy token

>>> re.sub(r"\([^)]*\)(((?!\().)*)$", r'\1', '*AWL* (GREATER) MINDS LIMITED (CLOSED) END')                        
# => '*AWL* (GREATER) MINDS LIMITED  END'  

Demo

说明:

  • \([^)]*\)匹配括号中的字符串
  • (((?!\().)*)$确保在字符串结尾之前没有其他左括号

    • (?!\()是负面的lookeahead,检查后面没有(
    • .匹配下一个字符(由于前瞻性不足而无法(
    • (((?!\().)*)$重复整个序列,直到字符串$结束并保存在捕获组中
  • 我们将匹配替换为第一个捕获组(\1),以保持括号后的匹配