python 如何使用正则表达式查找文本文件中存在的不同字符串

xsuvu9jc  于 2022-12-10  发布在  Python
关注(0)|答案(2)|浏览(188)

我有一个file.txt文件,如下所示:

this is first line       new line1
this is second line      new line2
new( line added )        new line3
this is third line       new line4
this is fourth line_1    new line5

从这我需要检查某些字符串是否存在于文件中,如果存在需要做一些行动。
这是当前代码:

import re
    with open("file.txt", "r") as f:
        first = False
        second = False
        third = False
        fourth = False
        
        for line in f:
            for str in line.split():
                pattern = re.compile('this|is|first|line')
                if pattern.match(str):
                    first = True
                    continue
                pattern = re.compile('this|is|second|line')
                if pattern.match(str):
                    second = True
                    continue
            if(first == True):
                print("something1")
            else:
                print("not found first")
                exit()
            if(second == True):
                print("something2")
            else:
                print("not found second")
                exit()

但当前输出为:

something1
not found second

但是expected code这个:

something1
something2

第二行出现在文件中,但仍在打印else条件。(注意:字符串的检查应按此顺序进行。即,如果第一个条件不存在,则应退出,不进行进一步检查)

dzhpxtsq

dzhpxtsq1#

单词或短语模式是正则表达式--只是非常简单的模式。在正则表达式中,大多数字符(包括字母和数字)都代表它们自己。例如,正则表达式模式1匹配字符串'1',模式boy匹配字符串'boy'。
有许多保留字符称为中继字符,它们不会在正则表达式中表示本身,但它们有特殊的意义,可用来建立复杂的模式。这些中继字符如下:.、*、[、]、、$和。

watbbzwu

watbbzwu2#

您的程序存在多个问题:

  1. firstsecond没有被重置回false(我将其移到了外部循环的主体中,因此它们现在是false)。
    1.当第二行与第一个模式不匹配时,调用exit(),这将中止整个程序。
    1.前面提到的问题,第一个正则表达式也匹配第二行的"this"。如果它们是互斥的,可能不应该。
    其他问题:
    1.您不需要对行进行split()并对其进行迭代。
    1.在循环内调用re.compile会影响性能。在循环外调用它可以加快程序的运行速度。
    1.您可以只使用if (pattern.match(line)),而不用将True/False赋给其他变量。
    修复的错误:
import re
with open("file.txt", "r") as f:

    for line in f:
        first = False
        second = False
        third = False
        fourth = False
        for str in line.split():
            pattern = re.compile('first')
            if pattern.match(str):
                first = True
                continue
            pattern = re.compile('second')
            if pattern.match(str):
                second = True
                continue
        if(first == True):
            print("something1")
        elif(second == True):
            print("something2")

所有问题已修复,代码为DRY-ed,等等:

import re
with open("file.txt", "r") as f:
    firstPattern = re.compile('this is first line')
    secondPattern = re.compile('this is second line')

    for line in f:
        if (firstPattern.match(line)):
            print("something1")
        elif (secondPattern.match(line)):
            print("something2")

相关问题