【问题标题】:Regex replace Big file正则表达式替换大文件
【发布时间】:2018-12-19 06:09:58
【问题描述】:

所以我有一个 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

在我的新文件中

【问题讨论】:

  • 你的意思是你只需要FF=re.sub(r"\$SETGLOBAL\b", text ,aa, 1)?只替换一次?
  • 除非你在有自己的怪癖的 Notepad++ 中这样做,否则消耗一个单词后的所有文本是没有意义的。请澄清您的意思 问题是,如果第一次出现之前的文本发生更改,那么我需要更改的组因此我的代码将不再工作。一些示例会有所帮助。
  • 是的,我只需要更改一次,所以最后的 1 就是这样做的。我编辑我的问题以包含它。我的问题如下:我需要一个新文件,其中包含上一个文件的所有文本和更改后的单词。当我使用 re.sub 执行此操作时,整个文件都会被覆盖,剩下的就是替换的文本。
  • 我编辑了问题以表明它不是重复的,并回答您的问题。
  • 试试re.sub(r"(\$SETGLOBAL\s+)\w+", r"\1{}".format(text), aa, 1)

标签: regex python-3.x


【解决方案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.x 中使用 re.U 标志时,还可以使用更多 Unicode 字符)。注意: \S+ 将匹配1 个或多个非空白字符。
  • \1 - 是对存储在第 1 组缓冲区中的值的反向引用

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

【讨论】:

    猜你喜欢
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    相关资源
    最近更新 更多