首页 > 解决方案 > 正则表达式替换大文件

问题描述

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

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)

问题是,为了更改我的大文件中的文本,我还需要正则表达式来捕获此事件之前和之后的所有内容。所以我可以编写新的文本文件,其中包含更改后的单词。

我该怎么做?

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

想象一下,我有例如以下文件:

123456
$SETGLOBAL AAAA
BBBBBB
$SETGLOBAL TTTT

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

123456
$SETGLOBAL CCCC
BBBBBB
$SETGLOBAL TTTT

但是我的解决方案覆盖了一切,我只剩下

$SETGLOBAL CCCC

在我的新文件中

标签: regexpython-3.x

解决方案


您可以在捕获组中捕获左侧上下文,然后匹配任何单词以稍后替换为组值的反向引用和另一个单词:

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 演示

这里,

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

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


推荐阅读