#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()
всегда возвращает anint
, вам не нужно его преобразовывать.
Ответ №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, поскольку мы используем встроенные методы для обработки строк. По крайней мере, на небольших входных данных.