ошибка с регулярным выражением, совпадающим с 2 исходными файлами, ожидаемой строкой или буфером - PullRequest
0 голосов
/ 27 апреля 2020

, поэтому я хотел бы из файла input.txt создать два словаря

, например, вот пример файла input.txt

@. VAR @first=Billy
@. VAR @last=Bob
@. PRINT VARS
@. VAR @petName=Gato
@. VAR @street="1234 Home Street"
@. VAR @city="New York" 
@. VAR @state=NY 
@. VAR @zip=21236 
@. VAR @title=Dr.
@. PRINT VARS
@. FORMAT LM=5  JUST=LEFT
@. PRINT FORMAT

, поэтому VAR @varName=value

то есть в случае @first=Billy вы получите что-то вроде varDict = {"first": "Billy"} верно? Теперь я хочу знать, как это сделать через весь файл

Есть два словаря, которые мне нужно заполнить, один для переменных и один для FORMAT, который просто содержит значения, на самом деле ничего не делает на данный момент.

Что касается требуемого вывода, во входном файле есть команды, которые при чтении будут инициировать либо добавление переменных в каталог, либо печать этого каталога, либо добавление в каталог форматирования. Я бы использовал такую ​​функцию pprint pprint.pprint(varDict , width=30) и вывел бы что-то вроде этого

{'first': 'Billy',
'last': 'Bob'}
{'city': 'New York',
'first': 'Billy',
 'last': 'Bob',
'petName': 'Gato',
'state': 'NY',
'street': '1234 Home Street',
'title': 'Dr.',
'zip': '21236'}
{'BULLET': 'o',
'FLOW': 'YES',
'JUST': 'LEFT',
'LM': '5',
'RM': '80'}

К сожалению, я постоянно получаю сообщения об ошибках в драйвере и исходном файле

AttributeError: 'list' object has no attribute 'groups'

TypeError: expected string or buffer

Driver.py

input=(sys.argv[1])

# Group 1. VAR
# Group 2. @first=Mae or JUST=RIGHT FLOW=NO
# pass Group 2 as atString
regexSearch = re.compile(r'^@. ([A-Z]+) (.*)', re.MULTILINE)
regexPrintVAR = re.compile(r'^@\.\s*PRINT\s(VARS)', re.MULTILINE)
regexPrintFORMAT = re.compile(r'^@\.\s*PRINT\s(FORMAT)',re.MULTILINE)
regexERRCheck = re.compile(r'^@\.\s*FORMAT\s+BAD', re.MULTILINE)

varDictionary = dict()
formatDictionary = {"FLOW":"YES", "LM":"1", "RM":"80","JUST":"LEFT","BULLET":"o"}

file = open(input, "r")
while True:
    inputLine = file.readline()
    matchObj = regexSearch.search(inputLine)
    command, atString = matchObj.groups()

    if command == "VAR":
        setVariable(atString,varDictionary)

    if command == "FORMAT":
        formatListERR = regexERRCheck.search(inputLine)
        if formatListERR != None:
            print("*** Not a recognizable command")
            line = file.readline()
        setFormat(atString, formatDictionary)

    if command == "PRINT":
        printVARObj = regexPrintVAR.search(inputLine)
        printFormatObj = regexPrintFORMAT.search(inputLine)

        if printVARObj != None:
            pprint.pprint(varDictionary, width=30)
        elif printFormatObj != None:
            pprint.pprint(formatDict, width=30)
    inputLine = file.readline()

file.close()

importFileIUse.py

# The atString is the remainder of the string after the VAR or FORMAT key word.
varDictionary = dict()
formatDictionary = {"FLOW":"YES", "LM":"1", "RM":"80","JUST":"LEFT","BULLET":"o"}

def setFormat(atString,formatDictionary):
    regexFormat = re.compile(r'((?:(?:\w+)=(?:\w+)\s*)*)$')
    line = re.split(" +", atString)
    formatList = regexFormat.search(line)
    if formatList:
            for param in formatList[0].split():
                    splitParam = param.split('=')
                    formatDictionary[splitParam[0]] = splitParam[1]

def setVariable (atString, varDictionary):
    regexVAR = re.compile(r'@(\w+)=(\w+|.*)\s*$', re.MULTILINE)
        # file = open(input)
        # line = file.readline()
        # line = re.split(" +", atString)
        #while line:
    varList = regexVAR.findall(atString)
    for key, value in varList:
        varDictionary[key] = value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...