re.sub对我不起作用

11
我试图使用re.sub来替换指定模式为某个值,比如说:
for lines in f:
    pattern='\${2}'+key[0]+'\${2}'
    re.search(pattern,lines)

这将返回找到模式的行。例如,如果获取到了以下之一,则为测试返回之一

这是一个$$test$$

我遇到的问题是当我执行以下操作时

re.sub(pattern,key[1],lines)

什么也没有发生。 我错过了什么?更多信息请参见key [0] = test key [1] = replace 所以我要做的是每当遇到“$$ test $$”时,它将替换为“replace”。 我没有问题找到“$$ test $$”,但出于某种原因re.sub没有替换它。


3
当您需要在字符串中存储反斜线时,最好使用双反斜杠形式。在Python中,对于您的情况,它仍然有效,因为在用反斜线前缀的美元符号没有特殊含义时,Python会保留这两个字符,但是在其他编程语言中,写'\$'只会表示'$'。当有人阅读一个字符串并发现反斜杠时,他们期望看到特殊字符或另一个反斜杠。如果您需要在字符串中使用多个反斜杠,则应使用原始字符串... - 6502
2
对于遇到一般re.sub问题的人,请确保将 re.IGNORECASE 作为 flags = 参数传递,而不是 count 参数。请参考 - Noumenon
2个回答

21

你是把 re.sub 的结果赋值给一个变量,对吗?例如:

lines = re.sub(pattern, key[1], lines)

这是一个字符串,所以它不能被改变(在Python中,字符串是不可变的),因此会创建一个新的字符串并返回给您。如果您不将其分配回名称,则会丢失它。


啊,我以为它已经替换了。我该如何在文件中替换这一行?顺便说一句,谢谢你。我简直不敢相信我没想到这个。 - aport002
在一个文件中,你将从输入文件读取每一行,并将其写入输出文件;最后,如果需要,删除原始文件并重命名输出文件。或者,如果文件可以完全装入内存,则可以将其全部读入内存,进行更改,然后写回到同一文件中。在SO和Web的其他地方有许多关于如何在Python中实现此操作的示例。 - kindall
非常感谢。你帮了我大忙。 - aport002
为了保持相关问题/答案的链接,我会发布这个链接:http://stackoverflow.com/questions/19598121/re-sub-not-working-for-me-with-python - Jonathan Komar

1
如果您有一段文本,可以直接在整个文本上运行re.sub(),如下所示:
import re

ss = '''that's a line
another line
a line to $$test$$
123456
here $$test$$ again
closing line'''

print(ss,'\n')

key = {0:'test', 1:'replace'}

regx = re.compile('\$\${[0]}\$\$'.format(key))

print( regx.sub(key[1],ss) )

.

如果你要读取一个文件,应该有兴趣将整个文件读入一个对象ss中,在运行re.sub()之前,而不是逐行读取和替换。

.

如果您有一系列的行,您必须按照以下方式进行处理:

import re

key = {0:'test', 1:'replace'}

regx = re.compile('\$\${[0]}\$\$'.format(key))

lines = ["that's a line",
         'another line',
         'a line to $$test$$',
         '123456',
         'here $$test$$ again',
         'closing line']

for i,line in enumerate(lines):
    lines[i] =  regx.sub(key[1],line)

否则,包含“$$test$$”的行将不会被修改:
import re

key = {0:'test', 1:'replace'}

regx = re.compile('\$\${[0]}\$\$'.format(key))

lines = ["that's a line",
         'another line',
         'a line to $$test$$',
         '123456',
         'here $$test$$ again',
         'closing line']

for line in lines:
    line =  regx.sub(key[1],line)


print (lines)

结果

["that's a line", 'another line', 'a line to $$test$$', '123456', 'here $$test$$ again', 'closing line']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接