当我有一个这样的字符串:
s1 = 'stuff(remove_me)'
我可以很容易地删除括号和文本
# returns 'stuff'
res1 = re.sub(r'\([^)]*\)', '', s1)
正如这里所解释的。
但我有时会遇到这样的嵌套表达式:
s2 = 'stuff(remove(me))'
当我从上面运行命令时,我最终
'stuff)'
我也试过:
re.sub('\(.*?\)', '', s2)
这给了我同样的输出。
我如何删除外括号内的所有内容——包括括号本身——这样我也会得到'东西'
(这应该适用于任意复杂的表达式)?
re
匹配非常迫切,因此它们会尝试匹配尽可能多的文本,对于您提到的简单测试用例,只需让regex运行即可:
>>> re.sub(r'\(.*\)', '', 'stuff(remove(me))')
'stuff'
如前所述,您需要一个递归正则表达式来匹配任意级别的嵌套,但是如果您知道最多只能有一个级别的嵌套,请尝试使用此模式:
\((?:[^)(]|\([^)(]*\))*\)
[^)(]
匹配一个字符,这不是括号(否定类)。|\([^)(]*\)
或者它匹配另一个(
)
对与任何数量的非)(
内部。(?:
...)*
所有这一切在(
)
这是regex101的演示
在交替之前,使用[^)(]
而不使用量词,如果不平衡,则会更快失败。
您需要添加更多可能发生的嵌套级别。例如最多2个级别:
\((?:[^)(]|\((?:[^)(]|\([^)(]*\))*\))*\)
regex101上的另一个演示
注意:\(.*\)
匹配左边的第一个(
),然后匹配直到最后一个)
的任何0个字符(如果未启用DOTALL修饰符,则不匹配换行符),并且不考虑正确嵌套的括号。
要使用Python中的正则表达式正确地删除嵌套的括号,您可以使用一个简单的\([^()]*\)
(匹配一个(
,然后是(
和)
之外的0个字符,然后是一个)
),然后使用re.subn
:
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
基本:删除(…)
内部没有
(
和)
,直到找不到匹配项。用法:
print(remove_text_between_parens('stuff (inside (nested) brackets) (and (some(are)) here) here'))
# => stuff here
也可以使用非regex方式:
def removeNestedParentheses(s):
ret = ''
skip = 0
for i in s:
if i == '(':
skip += 1
elif i == ')'and skip > 0:
skip -= 1
elif skip == 0:
ret += i
return ret
x = removeNestedParentheses('stuff (inside (nested) brackets) (and (some(are)) here) here')
print(x)
# => 'stuff here'
请看另一个Python演示
我试图找出从字符串中删除所有标点符号和空格的正确方法,但保留撇号不变,例如: 不会留下来,但“欲望”会变成“欲望”。 我试过使用
问题内容: 我想使用Java删除字符串中所有类型的方括号字符(例如:[],(),{})。 我尝试使用此代码: 但这不起作用,请帮助我。 问题答案: 要删除 _ 所有标点符号_ ,包括所有方括号,大括号和方括号…,按问题是:
我得到了这样的回应 因此,在使用时,由于前面有文本“stripe\product json:”,所以我得到了一个错误 请帮忙
问题内容: 我从来不是一个正则表达式大师,所以我需要您的帮助!我有一个像这样的字符串: 我想使用空格作为定界符来分割此字符串-但我不想分割在方括号内出现的空格。因此,从上面的示例中,我想要这个数组: 关于什么正则表达式的任何建议可以结合使用以实现这一目标? 这是另一个例子: 变成 问题答案: 我认为这应该起作用,使用负前瞻 -不匹配在没有括号的情况下关闭括号之前没有的空格: 对于嵌套的括号,您将需
问题内容: 我只是想知道如何在php中删除一组括号和括号本身之间的文本。 范例: ABC(测试1) 我想删除(Test1),只离开ABC 谢谢 问题答案: 是基于Perl的正则表达式替换例程。该脚本的作用是匹配所有出现的右括号,后跟任意数量的字符 而不是 右括号,然后再次跟右括号,然后删除它们: 正则表达式细目:
问题内容: 例如: 我可以这样做吗? 问题答案: 一个非常简单的实现是: 并继续添加任何其他类型的标点符号。 一种更有效的方法是 编辑:这里有关于效率和其他实现的更多讨论: 在Python中从字符串中删除标点符号的最佳方法