Perguntas de nível dois do Python: lista de escolas MOOC | extração e pesquisa de palavras-chave

1. Tópico

O arquivo anexado data.txt é o arquivo fonte de uma página HTML na plataforma Chinese University MOOC da Love Course Network do Ministério da Educação, que contém uma lista de universidades ou instituições que participam da construção do MOOC em meu país. ‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

Questão 1 : Escreva um programa para extrair a lista de nomes de universidades ou instituições de data.txt e escreva o resultado no arquivo univ.txt, com um nome de universidade ou instituição por linha, e imprima as universidades ou instituições na ordem em que aparecem em data.txt. O exemplo é o seguinte:

...
南京理工大学
...
南京师范大学
...‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

Dica: Todos os nomes de universidades estão presentes no arquivo data.txt como  alt="南京理工大学" . ‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

Question 2 : Please write a program to extract the name of the university from the univ.txt file. The name of the university refers to the words "university" or "college" but does not include the words "college student". Output all the names of universities on the screen. There is no blank line between each line of the university. Finally, give the number of names that contain "university" and "college" in the name, and the words that contain both "university" and "college" as their type. A amostra é a seguinte (o número na amostra não é o resultado real, o Jiahua College of Beijing Technology and Business University é contado como uma faculdade):

...
南京理工大学
...
长沙师范学院
...
包含大学的名称数量是10
包含学院的名称数量是12

Em segundo lugar, a solução para o primeiro problema

1. Solução oficial

Através do método split, primeiro divida os caracteres de acordo com [alt=] e, em seguida, divida-os com aspas. A primeira fatia leva o último elemento [-1] e a segunda leva o segundo elemento [1], que é o conteúdo após as aspas. Portanto, o código oficial é o seguinte.

fi = open("data.txt","r")
f = open("univ.txt","w")
for line in fi:
    if "alt" in line:
        dx = line.split("alt=")[-1].split('"')[1]
        f.write("{}\n".format(dx))
f.close()
fi.close()

2. Solução pessoal

Não há nenhum requisito no título, você pode usar expressões regulares para extrair, o que requer re.findall() para extrair. A vantagem disso é que você não precisa percorrer cada linha, pode ler diretamente o conteúdo e extraí-lo, economizando tempo e eficiência.

import re
f = open("univ.txt", "w")
with open("data.txt","r",encoding="utf-8") as fi:
    line = fi.read()
    line = re.findall('alt="(.*大学)"',line)
    for i in line:
         f.write(i+"\n")
f.close()

3. Solução da segunda questão

1. A solução oficial

A solução oficial é bastante satisfatória, usando loop for, julgamento if, abertura e fechamento de texto, troca de lista, etc.

n = 0    
m = 0    
f = open("univ.txt", "r")  
lines = f.readlines()      
f.close()   
for line in lines:      
    line = line.replace("\n","")   
    if '大学生' in line:           
        continue
    elif '学院' in line and '大学' in line:  
        if line[-2:] == '学院':
            m += 1
        elif line[-2:] == '大学':            
            n += 1
        print('{}'.format(line))
    elif '学院' in line:           
        print('{}'.format(line))                                      
        m += 1                     
    elif '大学' in line:           
        print('{}'.format(line))   
        n += 1
print("包含大学的名称数量是{}".format(n)) #输出大学计数
print("包含学院的名称数量是{}".format(m)) #输出学院计数

Considere excluir a palavra-chave de estudantes universitários e, em seguida, use o método de fatiamento de lista para julgar se o final do texto é faculdade ou universidade.

2. Solução pessoal

Na minha solução pessoal, tento usar expressões regulares para simplificar o programa e uso [$] para limitar o final com universidades e faculdades. Use [re.findall()] para determinar se uma palavra-chave está incluída.

import re
m = 0
n = 0
fi = open("univ.txt", "r",encoding='utf-8')
for line in fi:
    line = line.strip()
    daxue = re.findall("大学$",line)
    if len(daxue)!=0:
        m+=1
        print(line)
    xueyuan = re.findall("学院$",line)
    if xueyuan:
        print(line)
        n+= 1
print("包含大学的数量是{}".format(m))
print("包含学院的数量是{}".format(n))
fi.close()

3. Reflexão pós-escolar

  1. Existem muitas funções boas que podem ser usadas em expressões regulares, como re.sub() para substituição regular, re.findall() para pesquisa em lote e re.split() para segmentação com base em várias palavras-chave. Se você deseja simplificar seu programa, pode usar a regularização para otimizar o algoritmo.
  2. As soluções para simplificar o algoritmo incluem 1) substituir open() por open(); 2) substituir o loop for por uma compreensão de lista; 3) substituir outros loops pelo módulo de expressão regular re, porque além de ter alta eficiência de pesquisa, também pode ser localizado, por isso é altamente recomendado.
  3. Não há nenhum módulo embutido no programa de segundo nível do Python, e não é um foco na revisão, mas é poderoso na programação diária. É recomendável que você o domine com firmeza.

おすすめ

転載: blog.csdn.net/henanlion/article/details/131153711