Проверка символов в строке входного файла и возврат, если они содержат только допустимые символы

Поэтому я хочу запустить программу, которая будет построчно читать файл в файле, а затем распечатывать либо Valid, либо Invalid, в зависимости от содержания каждой строки.

В этом примере я говорю, что строка входного файла может содержать ABCabc или пробел. Если строка содержит только эти вещи, слово Valid должно быть напечатано. Если это просто пробел или он содержит какие-либо другие символы или буквы, он должен вывести "Invalid".

Вот что я придумал:

Я не могу заставить его распечатать "Действительный"

Можешь сказать почему? Спасибо!

input = sys.argv[1]
input = open(input,"r")
correctInput = ‘ABCabc ‘

line1 = input.readline()

while line1 != "":
    if all(char in correctInput for char in line1):
        print “Valid”
        line2 = input.readline()
    else:
        print “Invalid”
        line2 = input.readline()
    line1 = line2

2 ответа

Решение

Если вы распечатаете значение line1 перед вашим оператором if else вы увидите, что в нем есть символ новой строки. (The \n символ.) Это символ, который добавляется в конец каждой строки всякий раз, когда вы нажимаете клавишу ввода на клавиатуре, и вам нужно либо удалить символы новой строки, либо включить их в качестве допустимого ввода.

Чтобы включить его в качестве действительного ввода

+ Изменить correctInput = 'ABCabc '

в

correctInput = 'ABCabc \n',


Или отменить изменение символов новой строки

if all(char in correctInput for char in line1):

в

if all(char in correctInput for char in line1.replace('\n', '')):


Любой метод будет работать.

Кстати, input это функция в Python Хотя вам разрешено использовать его в качестве имени переменной, это не позволит вам использовать функцию ввода в вашей программе. Из-за этого считается плохой практикой использовать любые имена встроенных функций в качестве имен переменных.


Решение RegEx

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

import re

with open(sys.argv[1]) as fh:
  valid_lines = re.findall('^[ABCabc ]+\n', fh.read())

Это находит любые допустимые строки, используя шаблон '^[ABCabc ]+\n', Что делает этот шаблон регулярного выражения?

  • ^ символ обозначает начало строки
  • Затем наступает [ABCabc ], При использовании скобок разрешены только символы внутри этих скобок.
  • + после скобок означает, что те символы, которые в скобках должны быть найдены 1 или более раз.
  • И, наконец, мы проверяем, что за найденными допустимыми символами следует символ новой строки (\n). Это гарантирует, что мы проверили всю строку на наличие допустимых символов.

Это потому, что readline не удаляет '\n' из конца строки. Вы можете игнорировать эту проблему, разбивая содержимое файла на строки и проверяя их по одному.

import sys

file_name = sys.argv[1]
file = open(file_name ,"r")
correctInput = 'ABCabc '

lines = file.read().splitlines()

for line1 in lines:
    if all(char in correctInput for char in line1):
        print 'Valid'
    else:
        print 'Invalid'
Другие вопросы по тегам