regex - 正则表达式替换大文件
问题描述
所以我有一个 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
在我的新文件中
解决方案
您可以在捕获组中捕获左侧上下文,然后匹配任何单词以稍后替换为组值的反向引用和另一个单词:
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))
这里,
(\$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
只替换一次,即第一个匹配项。
推荐阅读
- c# - (C# .NET 5 REST API)使用转换器添加多态时输入无效
- go - 从原始字节创建数据包并使用 gopacket 写入 pcap
- jmeter - jmeter中的多个线程组
- sql - 使用 SQL 插入循环而不删除空格
- flutter - 如何将值发送到 Flutter 中的多个屏幕?
- python - Spark:如何使用动态嵌套结构/数组展平数据框
- asp.net-mvc - 我如何在数据库 MVC 5 中过滤日期范围过滤器
- java - 如何在 OkHttp 中测试 IOException 案例?
- ios - Visionkit 文档文本识别失败
- python - 我应该如何在破折号的@callback 函数中编写 if.else 函数?