【问题标题】:Python + Regex + Replace pattern with multiple copies of that patternPython + 正则表达式 + 用该模式的多个副本替换模式
【发布时间】:2015-09-01 00:21:00
【问题描述】:

我必须从用户那里获取一个字符串并对其进行格式化,以便某些命令行使用可以接受它。基本上,我需要用两个反斜杠替换双引号 (") 之前的任何反斜杠。我可以使用这个正则表达式找到模式:

import re

pattern = '\\\\+"'
string = "\\\\\\\" asdf \\\" \\ \\ \\\\\""

print string, "\n"
matches = re.findall(pattern, string)

但是现在我有了这些匹配项,我该如何用它们自己的双重副本替换它们?所以引号前面的 3 个反斜杠必须变为 6,斜杠 1 变为 2,斜杠 2 变为 4。不在引号前面的斜杠保持相同的长度。

对此的任何建议将不胜感激。

谢谢。

【问题讨论】:

  • 你能更明确地说明你想要什么输入和输出吗?什么是输入和输出的逐字示例;不用担心转义任何内容,只需向我们准确显示您想要的输入和输出即可。我只是想确保您在发布答案之前了解反斜杠的工作原理。 :)
  • 字符串变量是我试图替换斜杠的字符串。python 使用转义字符后,该字符串为:\\\" asdf \" \ \ \\"
  • 因此输出将是: \\\\\\" asdf \\" \ \ \\\\"

标签: python regex


【解决方案1】:

您应该使用单引号、原始字符串和re.sub

string = r'\\\" asdf \" \ \ \\"'
new_string = re.sub(r'(\\+)"', r'\1\1"', string)
print(new_string)

输出:

\\\\\\" asdf \\" \ \ \\\\"

模式

为了解释这个模式,我们先去掉括号;它们不会影响匹配的内容,我们稍后会将它们放回去。模式r'\\+"' 表示“一个或多个反斜杠后跟双引号”。即使它是一个原始字符串,我们仍然需要转义反斜杠,因为反斜杠在正则表达式中具有特殊含义;这就是为什么它是r'\\+"' 而不是r'\+"'

括号

实际模式中\\+ 周围的括号仅表示“捕获这些括号内的匹配部分”。这会将匹配中所有反斜杠的子字符串放入捕获组中。我们将在替换字符串中使用这个捕获组。

替换字符串

替换字符串r'\1\1"' 仅表示“第一个捕获组的两个副本后跟双引号”(在这种情况下,只有一个捕获组,但可以有更多)。替换字符串有双引号的原因是匹配有双引号;由于整个匹配被替换字符串替换,如果替换字符串没有双引号,则双引号将被删除。

【讨论】:

  • 很棒的解决方案。我坚持使用循环的想法,我知道必须有更好的方法来做到这一点。你能解释一下这是如何工作的吗?我认为这只会匹配并替换引号之前的斜杠。
  • @Crbreingan,我添加了一个解释。我可能有点过头了:)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 2015-01-06
  • 2017-08-08
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多