Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从字符串中删除括号之间的内容_Python_String - Fatal编程技术网

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
*
将匹配包括结束参数在内的所有内容。在结束时使用
,它将变为“非贪婪”,并在剩余正则表达式可以匹配时停止使用(即,下一个结束参数时)。
[^]*
在这种特殊情况下是一种替代方案。您的解决方案更糟糕,因为它不能覆盖所有情况:
“(您好)那里”
:)