正则表达式替换大文件

时间:2018-07-11 09:05:53

标签: regex python-3.x

所以我有一个3000行的大文件。我需要找到$ SETGLOBAL的第一个匹配项,并且需要在该词的第一个匹配项后更改该词。为此,我使用以下正则表达式

tables

问题在于,为了更改巨大文件中的文本,我还需要使用正则表达式来捕获此事件前后的所有内容。因此,我可以在其中写入更改后的单词的新文本文件。

我该怎么做?

我的问题是我需要变量FF中的整个文件。所以我可以将其写入新文件。

假设我有以下文件:

div

我需要的是一个如下的新文件

with open("textfile.txt","r") as F:
      FF=F.read()
FF=re.sub("\$SETGLOBAL\s(.*)", FF ,"CCCC",1)
F2 = open("textfile.txt","w").write(FF)

但是我的解决方案覆盖了所有内容,而我只剩下

123456
$SETGLOBAL AAAA
BBBBBB
$SETGLOBAL TTTT

在我的新文件中

1 个答案:

答案 0 :(得分:1)

您可以在捕获组中捕获左侧上下文,并且只需匹配任何单词,以后再用对该组值和另一个单词的后向引用替换即可。

import re
aa='''123456
$SETGLOBAL AAAA
BBBBBB
$SETGLOBAL TTTT'''
text="CCCC"
print(re.sub(r"(\$SETGLOBAL\s+)\w+", r"\1{}".format(text), aa, 1))
# or
# print(re.sub(r"(\$SETGLOBAL\s+)\S+", r"\1{}".format(text), aa, 1))

请参见Python demo

在这里

  • (\$SETGLOBAL\s+)\w+-匹配并将$SETGLOBAL和任何1+个空白字符捕获并捕获到组1中(后来从替换模式中用\1引用),仅将1个或多个单词字符与\w+\w匹配任何字母,数字或_字符(如果在Python 3中使用它,或者在Python 2中使用re.U标志,则匹配更多Unicode字符。 x)。注意:\S+将匹配1个或多个任何非空白字符。
  • \1-是对第1组缓冲区中存储的值的后向引用

1参数是 limit 参数,它告诉re.sub仅替换一次,即第一个匹配项。