所以我有一个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
在我的新文件中
答案 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
仅替换一次,即第一个匹配项。