关于Python中的Regex的一些问题

时间:2011-04-03 02:41:59

标签: 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" "#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(')')
  1. 它会将原始文本转换为

    CONTENTS
    1. INTRODUCTION
    ("1.1 The Linear Programming Problem 2" "#11")
    ("1.2 Examples of Linear Problems 7" "#16")
    

    最后两行是正确的,但是 前两行不是。所以我 想知道如何容纳 前两行,通过修改 当前代码,或使用一些 不同的代码?

  2. 代码不是我写的,而是 我想了解其用法 这里re.sub()。正如我发现的那样 一个Python网站,

      

    re.sub(正则表达式,替换,主题)   执行搜索和替换   主题,替换所有比赛   更换主题的正则表达式。该   结果由sub()返回   功能。您传递的主题字符串   没有修改。

    但是在我的代码中,它的用法是 `pat.sub(zaa,line)',似乎 我跟报价不一致 描述。所以我想知道如何 了解我的代码中的用法?

  3. 谢谢!

3 个答案:

答案 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 objectsub 方法re.sub()中的初始模式参数将替换为sub方法绑定到的正则表达式对象。换句话说,

pat.sub(zaa, line)

相当于

re.sub(pat, zaa, line)

顺便说一下可怕的变量名。