операторы python = и == счетчик

#python

#питон

Вопрос:

я написал текстовый файл, в который я поместил операторы = и == . Я написал код, который будет подсчитывать количество = и ==, но я не получаю правильное число.

 lexicalClass = file.readlines()

for lex in lexicalClass:
newList = re.findall('S ', lex)
for element in newList:
    if len(re.findall('[a-z] |[0-9] ', element)):
        identifiers.append(re.findall('[a-z] |[0-9] ', element))
        
num = len(re.findall('=', element))
if int(num):
    if int(num) % 2 == 1:
        for i in range(int((num-1)/2)):
            equal.append('==')
        assignment.append('=')
    else:
        for i in range(int(num/2)):
            equal.append('==')
        
print(str(len(equal)))
print(str(len(assignment)))
 

Мой файл .txt : a == b a = b c = d

И, как вы можете видеть, мой вывод должен быть 1 и 2, но я получаю 0 в обоих.

Комментарии:

1. Отступ выключен. Пожалуйста, исправьте. Как вы знаете, отступ имеет решающее значение для Python.

2. Ваша логика кажется неверной, наличие четного числа = не говорит о том, что их всего == , их также может быть два =

3. При использовании регулярных выражений всегда используйте необработанные строки. Спецификация неясна. Что === считается как? Три = и два == , один = и один == или ни то, ни другое? Похоже, вы анализируете файл исходного кода. Что, если он содержит == внутри строку, которая обычно игнорируется компилятором? Если вы разбираете код, регулярное выражение, скорее всего, не заведет вас слишком далеко. Спасибо за разъяснения.

4. почему вы избегаете = num = len(re.findall('=', element)) ввода? Кроме того, len() всегда возвращает an int , вам не нужно его преобразовывать.

Ответ №1:

Вероятно, вы могли бы сделать это с помощью утверждений lookahead и lookbehind:

 one_equals = r"(?<!=)=(?!=)"  # a "=" not followed or preceded by a =
two_equals = r"(?<!=)==(?!=)"  # "==" not followed or preceded by a =

assignment = 0
equals = 0
with open("yourfilename.txt") as f:
    for line in f:
        equal  = len(re.findall(one_equals, line))
        assignment  = len(re.findall(two_equals, line))
 

Ответ №2:

Если это исходный код Python, правильный способ сделать это с помощью ast модуля, используя ast.walk() и подсчитывая экземпляры узлов ast.Assign and ast.Eq :

 import ast

with open("yourfilename.txt") as f:
    parsed_source = ast.parse(f.read())
    nodes = list(ast.walk(parsed_source))
    equals = sum(isinstance(n, ast.Eq) for n in nodes)
    assignments = sum(isinstance(n, ast.Assign) for n in nodes)
 

Ответ №3:

Если вы действительно не заботитесь об эффективности алгоритма, это довольно простое решение:

 file = open("asd.txt")

total_double_eq_count = 0
total_single_eq_count = 0

#iterate over the lines of file
for line in file:
    #count of '=='s in the line
    double_eq_count = line.count("==")
    #count of '='s which are not followed by an another '='.
    single_eq_count = line.count("=") - 2*double_eq_count

    total_double_eq_count  = double_eq_count
    total_single_eq_count  = single_eq_count
    
print(total_double_eq_count)
print(total_single_eq_count)
 

Но это относительно быстро по сравнению с эквивалентным кодом python, поскольку мы используем встроенные методы для обработки строк. По крайней мере, на небольших входных данных.