当我有这样的字符串时:
s1 = 'stuff(remove_me)'
我可以使用
轻松删除括号和文本# returns 'stuff'
res1 = re.sub(r'\([^)]*\)', '', s1)
解释here。
但我有时遇到这样的嵌套表达式:
s2 = 'stuff(remove(me))'
当我从上面运行命令时,我最终得到了
'stuff)'
我也尝试过:
re.sub('\(.*?\)', '', s2)
给了我相同的输出。
如何删除外括号内的所有内容 - 包括括号本身 - 以便我最终得到'stuff'
(这应该适用于任意复杂的表达式)?
答案 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}},直到找不到匹配项。用法:
(
也可以采用非正则表达方式:
)
答案 1 :(得分:4)
如前所述,您需要recursive regex来匹配任意级别的嵌套,但如果您知道最多只能有一个级别的嵌套,请尝试使用此模式:
\((?:[^)(]|\([^)(]*\))*\)
[^)(]
匹配一个不是括号(negated class)的字符。|\([^)(]*\)
或与其中任意数量的非 (
内的)
)(
对匹配。(?:
... )*
所有这些(
)
内的所有这些时间
在交替使用[^)(]
没有+
量词之前,如果不平衡则更快失败。
您需要添加可能发生的更多级别的嵌套。例如,最多2个级别:
\((?:[^)(]|\((?:[^)(]|\([^)(]*\))*\))*\)
答案 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