如何删除字符串中外括号之间的所有文本?

时间:2016-05-30 14:41:52

标签: python regex parentheses

当我有这样的字符串时:

s1 = 'stuff(remove_me)'

我可以使用

轻松删除括号和文本
# returns 'stuff'
res1 = re.sub(r'\([^)]*\)', '', s1)

解释here

但我有时遇到这样的嵌套表达式:

s2 = 'stuff(remove(me))'

当我从上面运行命令时,我最终得到了

'stuff)'

我也尝试过:

re.sub('\(.*?\)', '', s2)

给了我相同的输出。

如何删除外括号内的所有内容 - 包括括号本身 - 以便我最终得到'stuff'(这应该适用于任意复杂的表达式)?

6 个答案:

答案 0 :(得分:9)

注意\(.*\)匹配左侧的第一个(,然后匹配任何0+个字符(如果未启用DOTALL修改器,则不包括换行符) last ),并未考虑正确嵌套的括号。

要使用Python中的正则表达式正确删除嵌套括号,您可以使用简单的\([^()]*\)(匹配(,然后匹配{{1以外的0 +字符使用re.subn while 块中的{}}和(以及)}:

)

基本上:删除内部没有def remove_text_between_parens(text): n = 1 # run at least once while n: text, n = re.subn(r'\([^()]*\)', '', text) # remove non-nested/flat balanced parts return text (...)的{​​{1}},直到找不到匹配项。用法:

(

也可以采用非正则表达方式:

)

请参阅another Python demo

答案 1 :(得分:4)

如前所述,您需要recursive regex来匹配任意级别的嵌套,但如果您知道最多只能有一个级别的嵌套,请尝试使用此模式:

\((?:[^)(]|\([^)(]*\))*\)
  • [^)(]匹配一个不是括号(negated class)的字符。
  • |\([^)(]*\)或与其中任意数量的 (内的) )(对匹配。
  • {li> (?: ... )*所有这些( ) 内的所有这些时间

Here is a demo at regex101

在交替使用[^)(]没有+量词之前,如果不平衡则更快失败。 您需要添加可能发生的更多级别的嵌套。例如,最多2个级别:

\((?:[^)(]|\((?:[^)(]|\([^)(]*\))*\))*\)

Another demo at regex101

答案 2 :(得分:2)

re匹配是热切的,所以他们尝试匹配尽可能多的文本,因为你提到的简单测试用例只是让正则表达式运行:

>>> re.sub(r'\(.*\)', '', 'stuff(remove(me))')
'stuff'

答案 3 :(得分:1)

如果您确定括号最初是平衡的,只需使用贪心版本:

re.sub(r'\(.*\)', '', s2)

答案 4 :(得分:1)

https://regex101.com/r/kQ2jS3/1

'(\(.*\))'

这会捕获furthest个括号,以及括号之间的所有内容。

您的旧正则表达式会捕获第一个括号,以及next括号之间的所有内容。

答案 5 :(得分:0)

我在这里找到了解决方法:

http://rachbelaid.com/recursive-regular-experession/

其中说:

extension Locale: CaseIterable {
    public static var allCases: [Locale] {
        availableIdentifiers.map(Locale.init(identifier:))
    }
}

extension Locale {
    static func localeForCurrencyCode(_ currencyCode: String) -> Locale? {
        return allCases.first(where: { $0.currencyCode == currencyCode })
    }
}

Locale.localeForCurrencyCode("EUR") // es_EA
Locale.localeForCurrencyCode("GBP") // kw_GB