2024-04-20 08:24:38 发布
网友
所以我有一个测试字符串
content = 'I opened my mouth, "Good morning!" I said cheerfully'
我想使用regex删除双语音标记之间的文本,但不是语音标记本身。所以它会回来的
我使用以下代码
content = re.sub(r'".*"'," ",content)
但这也消除了双重言语标记。 我应该使用什么样的模式来保留语音标记,但删除其中的文本。在
您还可以使用环视:
(?<=")([^"]+)(?=")
Debuggex Demo
两个注意事项:
.*
[^"]+
重要的是,当两个双引号子字符串在整个字符串中时,这将不起作用,除非增加下一个搜索开始的索引。所以,举例来说
我张开嘴,“早上好!”我高兴地说。”大家好吗?”
为了而不是捕获I said cheerfully.,必须在“早安”之后将索引增加一找到了。在
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
顺便说一句,.*尽可能匹配(贪婪)。要匹配非贪婪的时尚,请使用.*?或{}。在
.*?
您可能需要使用“lookaround”表达式:
>>> content = 'I opened my mouth, "Good morning!" I said cheerfully' >>> content = re.sub(r'(?<=").*(?=")', '', content)
这表示“匹配前面有引号,后面有引号的任何内容”。在
这种方法的优点是,您可以在lookaround中使用不同的内容—例如,您可以匹配(?<"|')来匹配单引号或双引号,而不使用引号标记。如果你把你“换了又放回去”的东西硬接线,你就不能这么做。在
(?<"|')
按照我写的格式,这将是一个“贪婪”匹配-也就是说,它将匹配尽可能大的表达式。如果您有多对引号,您可能需要使用“non-greedy quantifier”.*?,它表示“一旦找到匹配项就停止”(即在下一个双引号处停止)。您还可以显式匹配“只有非双引号的东西”,即
请注意,您仍然需要“结束引号”,因此您不会最终匹配从单个引号到字符串末尾的所有内容。在
您还可以使用环视:
Debuggex Demo
^{pr2}$两个注意事项:
.*
将捕获字符串中最后一个双引号之前的所有内容,而不是下一个双引号。这就是为什么我做了[^"]+
。在重要的是,当两个双引号子字符串在整个字符串中时,这将不起作用,除非增加下一个搜索开始的索引。所以,举例来说
我张开嘴,“早上好!”我高兴地说。”大家好吗?”
为了而不是捕获
I said cheerfully.
,必须在“早安”之后将索引增加一找到了。在使用
'""'
作为替换字符串:顺便说一句,}。在
^{pr2}$.*
尽可能匹配(贪婪)。要匹配非贪婪的时尚,请使用.*?
或{您可能需要使用“lookaround”表达式:
这表示“匹配前面有引号,后面有引号的任何内容”。在
这种方法的优点是,您可以在lookaround中使用不同的内容—例如,您可以匹配
(?<"|')
来匹配单引号或双引号,而不使用引号标记。如果你把你“换了又放回去”的东西硬接线,你就不能这么做。在按照我写的格式,这将是一个“贪婪”匹配-也就是说,它将匹配尽可能大的表达式。如果您有多对引号,您可能需要使用“non-greedy quantifier”
^{pr2}$.*?
,它表示“一旦找到匹配项就停止”(即在下一个双引号处停止)。您还可以显式匹配“只有非双引号的东西”,即请注意,您仍然需要“结束引号”,因此您不会最终匹配从单个引号到字符串末尾的所有内容。在
相关问题 更多 >
编程相关推荐