我想知道如何在字符串中删除最后一次出现的()
及其内容。
以下代码删除字符串中的所有()。
bracketedString = '*AWL* (GREATER) MINDS LIMITED (CLOSED)'
nonBracketedString = re.sub("\s\(.*?\)", '', bracketedString)
print(nonBracketedString1)
我想要以下输出。
*AWL* (GREATER) MINDS LIMITED
答案 0 :(得分:5)
您可以仅删除字符串末尾带有前导空格的(...)
子字符串:
\s*\([^()]*\)$
请参阅regex demo。
<强>详情
\s*
- 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'
说明:
\([^)]*\)
匹配括号中的字符串 (((?!\().)*)$
确保在字符串结尾之前没有其他左括号
(?!\()
是负面的lookeahead,检查后面没有(
.
匹配下一个字符(由于前瞻性不足而无法(
)(((?!\().)*)$
重复整个序列,直到字符串$
结束并保存在捕获组中\1
),以保持括号后的匹配