我在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
你们有没有遇到过这种行为? 这里有什么我想念的吗?
由于
答案 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)