re.sub()覆盖我的字符串

时间:2013-03-13 14:45:11

标签: python string replace

我在Python中遇到re.sub()函数的奇怪行为。

在字符串中,我想替换所有出现的内容,例如

- list 1
- list 2

使用HTML代码

<li>list 1</li>
<li>list 2</li>

所以我用

text = re.sub('(- (?P<id>.))', '<li>\g<id></li>', text)

工作并返回

<li>l</li>ist 1
<li>l</li>ist 2

然后我在正则表达式中添加+以匹配整个句子(即“list 1”,“list 2”)

text = re.sub('(- (?P<id>.+))', '<li>\g<id></li>', text)

令人惊讶的是,它会返回

</li>ist 1
</li>ist 2

\g<id>之后的文字覆盖了字符串的左侧部分。

如果我尝试<li>\g<id>foo而是返回foot 1

你们有没有遇到过这种行为? 这里有什么我想念的吗?

由于

1 个答案:

答案 0 :(得分:2)

您的输入文件在行尾有回车符('\r')。所以,第一个输入行是:

 - list 1\r\n

由于\r将光标移动到当前行的开头,并且\n移动到下一行的开头,因此您可以print该字符串而不会注意到。

替换后,您的行看起来像:

<li>list 1\r</li>\n

这会导致</li>在打印时出现在当前行的开头。

您有几种可能的解决方案:

  • 在输入
  • 上删除\r
  • 从匹配的字符类中排除\r

第一个示例是使用open(fname, 'rU')打开文本文件。

第二个例子是re.sub('(- (?P<id>[^\r\n]+))', '<li>\g<id></li>', text)