Python正则表达式替换引号中的文本,引号本身除外

Python正则表达式替换引号中的文本,引号本身除外,python,regex,Python,Regex,例如,我有一个测试字符串 content = 'I opened my mouth, "Good morning!" I said cheerfully' 我想使用正则表达式删除两个语音标记之间的文本,但不是语音标记本身。所以它会回来 'I opened my mouth, "" I said cheerfully' 我正在使用以下代码 content = re.sub(r'".*"'," ",content) 但这也消除了双重言语标记。 我应该使用什么模式来保留语音标记,但删除其中的文本

例如,我有一个测试字符串

content = 'I opened my mouth, "Good morning!" I said cheerfully'
我想使用正则表达式删除两个语音标记之间的文本,但不是语音标记本身。所以它会回来

'I opened my mouth, "" I said cheerfully'
我正在使用以下代码

content = re.sub(r'".*"'," ",content)
但这也消除了双重言语标记。 我应该使用什么模式来保留语音标记,但删除其中的文本。

使用
“”“”
作为替换字符串:

>>> content = 'I opened my mouth, "Good morning!" I said cheerfully'
>>> content = re.sub(r'".*"', '""', content)
>>> print(content)
I opened my mouth, "" I said cheerfully
顺便说一句,
*
尽可能匹配(贪婪)。要匹配非贪婪方式,请使用
*?
[^”]*

>>> content =  'I opened my mouth, "Good morning!" I said cheerfully. "How is everyone?"'
>>> content = re.sub(r'".*?"', '""', content)
>>> print(content)
I opened my mouth, "" I said cheerfully. ""

您还可以使用lookarounds:

(?<=")([^"]+)(?=")
(?您可能希望使用“lookaround”表达式:

>>> content = 'I opened my mouth, "Good morning!" I said cheerfully'
>>> content = re.sub(r'(?<=").*(?=")', '', content)

注意,你仍然需要“结束引用”,所以你不会结束从单个引用到字符串结尾的所有事物。

应该是代码>内容= Re.Sub(r)(我不认为你需要表达式中间部分的括号-为什么不<代码>(?如果文本只是要删除,那么括号也应该删除,因为这将是一个小的效率提高。这几乎奏效。但如果我“我张开嘴,”早上好!”我高兴地说。“大家好吗?”它匹配(早上好,我高兴地说,大家好吗?),它只应该匹配(早上好!大家好吗?)@格雷霍恩比:我不会把这称为正则表达式中的缺陷,相反,你只需要知道,在再次搜索之前,索引必须增加到超过结束双引号。我会澄清这一点。注意正则表达式不能计数,所以它们不能匹配对。如果内容不平衡,例如
,那么这些将很容易损坏。警察说d“你需要把车停在离路边不到六英寸的地方。”(这也是一个很好的回答!我没有看到that@RonenNess,你在答案中尝试过非贪婪版本吗?(顺便说一句)@falsetru-oops你是对的,非贪婪版本适用于两种情况。谢谢!
>>> content = 'I opened my mouth, "Good morning!" I said cheerfully'
>>> content = re.sub(r'(?<=").*(?=")', '', content)
re.sub(r'(?<=")[^"]*(?=")', '', content)