我想进行一些文本转换,例如从文本文件中读取:
CONTENTS
1. INTRODUCTION
1.1 The Linear Programming Problem 2
1.2 Examples of Linear Problems 7
并写入另一个文本文件:
("CONTENTS" "#")
("1. INTRODUCTION" "#")
("1.1 The Linear Programming Problem 2" "#11")
("1.2 Examples of Linear Problems 7" "#16")
我用于此类转换的当前Python代码是:
infile = open(infilename)
outfile = open(outfilename, "w")
pat = re.compile('^(.+?(\d+)) *$',re.M)
def zaa(mat):
return '("%s" "#%s")' % (mat.group(1),str(int(mat.group(2))+9))
outfile.write('(bookmarks \n')
for line in infile:
outfile.write(pat.sub(zaa,line))
outfile.write(')')
它会将原始文本转换为
CONTENTS
1. INTRODUCTION
("1.1 The Linear Programming Problem 2" "#11")
("1.2 Examples of Linear Problems 7" "#16")
最后两行是正确的,但是 前两行不是。所以我 想知道如何容纳 前两行,通过修改 当前代码,或使用一些 不同的代码?
代码不是我写的,而是
我想了解其用法
这里re.sub()
。正如我发现的那样
一个Python网站,
re.sub(正则表达式,替换,主题) 执行搜索和替换 主题,替换所有比赛 更换主题的正则表达式。该 结果由sub()返回 功能。您传递的主题字符串 没有修改。
但是在我的代码中,它的用法是 `pat.sub(zaa,line)',似乎 我跟报价不一致 描述。所以我想知道如何 了解我的代码中的用法?
谢谢!
答案 0 :(得分:3)
使用正则表达式,您正在搜索以数字结尾的行(可能是尾随空格)。您可以将数字设为可选:^(.+?(\d+)?) *$
并确保zaa
内的第2组引用可以处理空字符串。
def zaa(mat):
return '("%s" "#%s")' % (mat.group(1), (str(int(mat.group(2))+9) if mat.group(2) else "") )
有了这个,当mat.group(2)
为空时,你应该得到“#”,当它不是空的时候你得到的是#。
答案 1 :(得分:2)
此测试脚本生成所需的输出:
import re
infilename = "infile.txt"
outfilename = "outfile.txt"
infile = open(infilename)
outfile = open(outfilename, "w")
pat = re.compile('^(.+?(\d*)) *$',re.M)
def zaa(mat):
if mat.group(2):
return '("%s" "#%s")' % (mat.group(1),str(int(mat.group(2))+9))
else:
return '("%s" "#")' % (mat.group(1))
outfile.write('(bookmarks \n')
for line in infile:
outfile.write(pat.sub(zaa,line))
outfile.write(')')
答案 2 :(得分:1)
但是在我的代码中,它的用法是
pat.sub(zaa,line)
,这在我看来与引用的描述不一致。
区别在于sub
电话;您引用的文档是re.sub
函数,但这里使用的是编译regular expression object的sub
方法 。 re.sub()
中的初始模式参数将替换为sub
方法绑定到的正则表达式对象。换句话说,
pat.sub(zaa, line)
相当于
re.sub(pat, zaa, line)
顺便说一下可怕的变量名。