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

2024-04-20 08:24:38 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一个测试字符串

content = 'I opened my mouth, "Good morning!" I said cheerfully'

我想使用regex删除双语音标记之间的文本,但不是语音标记本身。所以它会回来的

^{pr2}$

我使用以下代码

content = re.sub(r'".*"'," ",content)

但这也消除了双重言语标记。 我应该使用什么样的模式来保留语音标记,但删除其中的文本。在


Tags: 字符串代码标记文本my语音contentregex
3条回答

您还可以使用环视:

(?<=")([^"]+)(?=")

Regular expression visualization

Debuggex Demo

^{pr2}$

两个注意事项:

  • .*将捕获字符串中最后一个双引号之前的所有内容,而不是下一个双引号。这就是为什么我做了[^"]+。在
  • 重要的是,当两个双引号子字符串在整个字符串中时,这将不起作用,除非增加下一个搜索开始的索引。所以,举例来说

    我张开嘴,“早上好!”我高兴地说。”大家好吗?”

为了而不是捕获I said cheerfully.,必须在“早安”之后将索引增加一找到了。在

使用'""'作为替换字符串:

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

顺便说一句,.*尽可能匹配(贪婪)。要匹配非贪婪的时尚,请使用.*?或{}。在

^{pr2}$

您可能需要使用“lookaround”表达式:

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

这表示“匹配前面有引号,后面有引号的任何内容”。在

这种方法的优点是,您可以在lookaround中使用不同的内容—例如,您可以匹配(?<"|')来匹配单引号或双引号,而不使用引号标记。如果你把你“换了又放回去”的东西硬接线,你就不能这么做。在

按照我写的格式,这将是一个“贪婪”匹配-也就是说,它将匹配尽可能大的表达式。如果您有多对引号,您可能需要使用“non-greedy quantifier”.*?,它表示“一旦找到匹配项就停止”(即在下一个双引号处停止)。您还可以显式匹配“只有非双引号的东西”,即

^{pr2}$

请注意,您仍然需要“结束引号”,因此您不会最终匹配从单个引号到字符串末尾的所有内容。在

相关问题 更多 >