【问题标题】:Stripping the last occurrence of text inside braces from a string从字符串中去除大括号内最后出现的文本
【发布时间】:2018-03-08 22:29:55
【问题描述】:

我想知道如何去除最后出现的() 及其给定字符串的内容。

以下代码将字符串中的所有 () 去掉。

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

我想要以下输出。

*AWL* (GREATER) MINDS LIMITED

【问题讨论】:

  • 为什么要为此使用正则表达式?只需找到最后一个卷曲,如果找到,将其删除。
  • 那些不是卷发。
  • 值得注意的是,您刚刚举了一个最著名的例子,总是给出的“正则语言无法解析的东西”,并询问如何用正则表达式解析它们。当然,re 可以做的远不止是一种实际的正则语言,而且您的数据可能有些东西即使使用严格的正则表达式也可以做到这一点(例如,您的括号不能嵌套,或者只能嵌套到深度 3 或其他),但这仍然是一个好兆头,表明您可能在这里找到了错误的工具。

标签: python regex python-3.x


【解决方案1】:

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

\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+ 个空格
  • (\((?>[^()]+|(?1))*\)) - 第 1 组:
    • \( - 一个(
    • (?>[^()]+|(?1))* - 除了 () 或整个 Group 1 模式之外,1+ 字符的零次或多次重复
    • \) - 一个)
  • $ - 字符串结束。

【讨论】:

  • 这很好用,但我想删除最后一个大括号内的所有内容。例如,如果我给'AWL(GREATER)MINDS LIMITED(CLOSED(Jan))',那么它不起作用......
  • @VKB 查看更新的答案,在字符串示例的末尾删除了嵌套括号。
【解决方案2】:

如果您想替换最后出现的括号,即使它们不在字符串的末尾:

*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

解释:

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

    • (?!\() 是负前瞻,检查是否没有 ( 跟随
    • . 匹配下一个字符(不能是 (,因为负前瞻)
    • (((?!\().)*)$ 整个序列重复直到字符串 $ 的结尾并保存在捕获组中
  • 我们将匹配替换为第一个捕获组 (\1),该组在括号后保持匹配

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多