关于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表示另一个是什么?
    +
    表示一个或多个(可能不同的)字符