0

基本上我有一个巨大的文本文件,其中有几行除了一个'@'符号之外什么都没有。

我想打印第一行之前的每一行,这只是一个'@'符号。

我是 python 新手,但对正则表达式非常熟悉,但我就是想不通。这是我到目前为止所得到的:

original = open('oldfile.txt')
for each_line in original:  
    pattern = re.compile("(^.*)(^@\s)", re.M)
    m = re.match(pattern, each_line).group(1)
    print(m)

original.close

我发誓我已经阅读了一个半小时的 python 在线文档和其他 stackoverflow 文章,但不知何故我仍然没有得到这个。

该代码的结果是:

AttributeError:“NoneType”对象没有属性“组”

4

2 回答 2

3

这里不需要正则表达式,其实很简单:

with open('file.txt') as file:
    for line in file:
        line = line.rstrip("\n")
        if line == "@":
            break
        print(line)

我们打开文件(使用with更易读的语句,并确保文件关闭,即使发生异常),然后循环遍历文件中的行。如果该行只是"@",我们将跳出循环,否则,我们打印该行并继续。

正如评论中所指出的,我们需要从行中删除换行符(或检查"@\n"(如果我们这样做,我们还需要print(line, end="")在 3.x 或print line,2.x 中这样做以停止print()添加额外的换行符)。

正如 Martijn Piters 指出的那样,还有另一种方法可以做到这一点,使用takewhile()函数 from itertools。这会从可迭代对象中获取项目,直到满足条件,这正是我们想要的:

import itertools

with open('file.txt') as file:
    for line in itertools.takewhile(lambda x: x != "@\n", file):
        print(line, end="")

我会争辩说,对于仅将值打印出来,这很难阅读,但是在某些情况下它可能很有用(例如,如果您希望列出值,或者将它们传递给另一个函数,让它们作为一个可迭代的是有用的)。

于 2013-02-28T19:06:09.090 回答
0

正如 Lattyware 所提到的,您不需要正则表达式。

至于您的代码的问题,当字符串与模式不匹配时,re.match返回None而不是匹配对象。在这种情况下,您可以调用该group属性。这就是异常的原因:None,它是类型的实例(实例NoneType,没有属性group

此外,该re.compile语句应该在循环之外,否则显式编译正则表达式没有多大意义。

于 2013-02-28T19:09:21.297 回答