关于Python中正则表达式的几个问题
我想进行一些文本转换,例如从文本文件读入:关于Python中正则表达式的几个问题,python,regex,Python,Regex,我想进行一些文本转换,例如从文本文件读入: 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" "#
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")
并写入另一个文本文件:
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)“,似乎
我的观点与引用的观点不一致
描述所以我想知道怎么做
了解我的代码中的用法谢谢 使用正则表达式,您正在搜索以数字结尾的行(可能是尾随空格)。您可以将数字设置为可选:
^(+?(\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)
为空时,您应该得到“#”,而当当前得到的值不为空时,您应该得到它。使用正则表达式,您正在搜索以数字结尾的行(可能是尾随空格)。您可以将数字设置为可选:^(+?(\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)
为空时,您应该得到“#”,而当它不为空时,您当前得到的是什么
但在我的代码中,它的用法是pat.sub(zaa,line),在我看来,这与引用的描述不一致
区别在于sub
调用;您引用的文档是针对re.sub
函数的,但这里使用的是编译后的函数的sub
方法。re.sub()
中的初始模式参数将替换为绑定了sub
方法的正则表达式对象。换句话说
pat.sub(zaa, line)
相当于
re.sub(pat, zaa, line)
顺便说一句,糟糕的变量名
但在我的代码中,它的用法是pat.sub(zaa,line),在我看来,这与引用的描述不一致
区别在于sub
调用;您引用的文档是针对re.sub
函数的,但这里使用的是编译后的函数的sub
方法。re.sub()
中的初始模式参数将替换为绑定了sub
方法的正则表达式对象。换句话说
pat.sub(zaa, line)
相当于
re.sub(pat, zaa, line)
顺便说一句,变量名很糟糕。此测试脚本生成所需的输出:
重新导入
infilename=“infile.txt”
outfilename=“outfile.txt”
填充=打开(填充名称)
输出文件=打开(输出文件名称,“w”)
pat=re.compile('^(+?(\d*)*$',re.M)
def zaa(mat):
如果材料组(2):
返回“(%s”“#%s”)”%(材料组(1),str(int(材料组(2))+9))
其他:
返回“(“%s”“#”)%”(材料组(1))
outfile.write('(书签\n')
对于填充中的线:
输出文件写入(pat.sub(zaa,行))
outfile.write(“)”)
此测试脚本生成所需的输出:
重新导入
infilename=“infile.txt”
outfilename=“outfile.txt”
填充=打开(填充名称)
输出文件=打开(输出文件名称,“w”)
pat=re.compile('^(+?(\d*)*$',re.M)
def zaa(mat):
如果材料组(2):
返回“(%s”“#%s”)”%(材料组(1),str(int(材料组(2))+9))
其他:
返回“(“%s”“#”)%”(材料组(1))
outfile.write('(书签\n')
对于填充中的线:
输出文件写入(pat.sub(zaa,行))
outfile.write(“)”)
这是真正的代码吗?您正在添加11,但2+11=13而不是11。@Mikel:谢谢您指出这一点。我的打字错误。刚刚更正。我也对re.sub()
这件事感到困惑。原来有两个子函数:re.sub(pattern,repl,string[,count])
和另一个子函数用于已编译的regex对象:RegexObject.sub(repl,string[,count=0])
。此函数使用后一种语法。这是真正的代码吗?您正在添加11,但2+11=13而不是11。@Mikel:谢谢您指出这一点。我的打字错误。刚刚更正。我也对re.sub()
这件事感到困惑。原来有两个子函数:re.sub(pattern,repl,string[,count])
和另一个子函数用于已编译的regex对象:RegexObject.sub(repl,string[,count=0])
。此函数使用后一种语法。谢谢!我想知道如何确保我在zaa中的第2组引用可以处理空字符串?@Tim,我已经编辑了我的答案,让它更清晰一些。我的zaa
副本应该可以优雅地处理map.group(2)
为空。谢谢!我在“?”得到了一个“语法错误:无效语法”。好的,这个现在编译:)谢谢!我想知道如何确保我在zaa中的第2组引用可以处理空字符串?@Tim,我已经编辑了我的答案,让它更清晰一些。我的zaa
副本应该可以优雅地处理map.group(2)
为空。谢谢!我在“?”得到了一个“语法错误:无效语法”。好的,这个现在编译:)谢谢!Python官方网站上有关于regex对象的子方法的描述吗?谢谢!Python官方网站上有关于regex对象的子方法的描述吗?谢谢!效验如神我想知道“+”是指重复一个或多个字符,还是指一个或多个字符的序列不一定相同?如果这两个字符中有一个是它的意思,那么regex表示另一个是什么?+
表示一个或多个(可能不同的)字符