Python 从字符串中删除括号之间的内容
我有这样一个字符串:Python 从字符串中删除括号之间的内容,python,string,Python,String,我有这样一个字符串: s = 'word1 word2 (word3 word4) word5 word6 (word7 word8) word9 word10' >>> re.sub(r'\(.*?\)\ *', '', s) 'word1 word2 word5 word6 word9 word10' 如何删除括号中的所有内容,以便输出: 'word1 word2 word5 word6 word9 word10' 我试过正则表达式,但似乎不起作用。有什么建议吗 最好
s = 'word1 word2 (word3 word4) word5 word6 (word7 word8) word9 word10'
>>> re.sub(r'\(.*?\)\ *', '', s)
'word1 word2 word5 word6 word9 word10'
如何删除括号中的所有内容,以便输出:
'word1 word2 word5 word6 word9 word10'
我试过正则表达式,但似乎不起作用。有什么建议吗
最好的
Jacques您应该用空字符串替换所有出现的正则表达式:
\([^\)]*\)
import re
s = re.sub(r'\(.*?\)', '', s)
请注意,这仅删除括号之间的所有内容。这意味着您将在“word2和word5”之间留下两倍的空格。从我的终端输出:
>>> re.sub(r'\(.*?\)', '', s)
'word1 word2 word5 word6 word9 word10'
>>> # -------^ -----------^ (Note double spaces there)
但是,您提供的输出并非如此。要删除多余的空格,可以执行以下操作:
s = 'word1 word2 (word3 word4) word5 word6 (word7 word8) word9 word10'
>>> re.sub(r'\(.*?\)\ *', '', s)
'word1 word2 word5 word6 word9 word10'
你可以一个字一个字地看。如果保留一个字符串作为结果字符串,一个字符串作为放弃字符串,以及一个布尔值,表示是否立即删除 然后,对于每个字符,如果布尔值为true,则将其添加到删除字符串,如果为false,则将其添加到真实字符串。如果是开括号,则将其添加到删除字符串中,并将布尔值设置为true;如果是右括号,则将删除字符串设置为“”,并将布尔值设置为false 最后,如果有一个括号已打开但未关闭,则最后会留下一个删除字符串
如果要处理多个方括号,请使用已打开但未关闭的整数计数,而不是布尔值。我的解决方案更好,因为它删除了多余的空格字符;-) 编辑:您正在编写,它不会捕获所有案例。当然,我可以编写更复杂的表达式,尝试考虑更多细节:
re.sub( "\s*\(.*?\)\s*"," ",s)
现在,如果原始字符串受括号和空格限制,则结果为所需字符串或“”。如果行的格式始终与显示的格式相同,则可能可以尝试不使用正则表达式:
>>> s.replace('(','').replace(')','')
'word1 word2 word3 word4 word5 word6 word7 word8 word9 word10'
这比常规表达式快4倍
>>> t1 = timeit.Timer("s.replace('(','').replace(')','')", "from __main__ import s")
>>> t2 = timeit.Timer("sub(r'\(.*?\)\ *', '', s)", "from __main__ import s; from re import sub")
>>> t1.repeat()
[0.73440917436073505, 0.6970294320000221, 0.69534249907820822]
>>> t2.repeat()
[2.7884134544113408, 2.7414613750137278, 2.7336896241081377]
您尝试的哪个正则表达式不起作用?如果您需要实际代码,请在此处给我写一条注释,我会添加它。原始字符串可能更安全:r'\(.*?)',尽管它无论如何都会起作用。我同意。它们都应该是原始字符串。谢谢我已经更新了答案。这非常有效,但为什么?我提出:
s=re.sub('\(.*),'',s)
这个“?”是做什么的?Jacques,(
在正则表达式字符串中有一个特殊的含义。(.*)
是一个组。因此,您需要用反斜杠转义(
来删除它的特殊含义,这样它就被视为一个文本(
待匹配。@Jacques:Just*
将匹配包括结束参数在内的所有内容。在结束时使用?
,它将变为“非贪婪”,并在剩余正则表达式可以匹配时停止使用(即,下一个结束参数时)。[^]*
在这种特殊情况下是一种替代方案。您的解决方案更糟糕,因为它不能覆盖所有情况:“(您好)那里”
:)