0

re.sub()在 Python 中遇到了一个奇怪的行为。

在一个字符串中,我想替换所有出现的情况,例如

- 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

你们是否已经面临这种行为?我在这里缺少什么吗?

谢谢

4

1 回答 1

2

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

 - list 1\r\n

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

替换后,您的行如下所示:

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

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

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

  • 剥离\ron 输入
  • \r从匹配的字符类中排除

第一个示例是使用open(fname, 'rU').

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

于 2013-03-13T15:09:53.370 回答