Как правильно разобрать элементы из сложной строки с помощью регулярного выражения - PullRequest
0 голосов
/ 02 апреля 2019

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

Данные могут быть в следующих форматах

STATICFIELD1.STATICFIELD2.VARIABLE1.STATICFIELD3/VARIABLE2
STATICFIELD1.STATICFIELD2.VARIABLE1.VARIABLE2.STATICFIELD3/VARIABLE3
STATICFIELD1.STATICFIELD2..VARIABLE1.STATICFIELD3/VARIABLE2
STATICFIELD1.STATICFIELD2.VARIABLE1/VARIABLE2
STATICFIELD1.STATICFIELD2..VARIABLE1/VARIABLE2

Проблема, с которой я сталкиваюсь, состоит в том, что использование регулярного выражения для разделения на основе периодов и косых черт означает, что если перед переменным стоит точка, он не включает этот период. Я хочу иметь возможность иметь переменную в виде строки, если она имеет точку впереди, например, var = ".VARIABLE1" и в то же время var = "VARIABLE.VARIABLE2". Мне не нужно хранить статические поля, мне просто нужно иметь возможность извлекать переменные поля независимо от того, есть ли один, два или один с литеральным периодом впереди.

Я пытался использовать re.search, но могу получить только первое статическое поле. Я попытался использовать re.split ('. | /', Line), но затем я столкнулся с проблемами, связанными с невозможностью анализа переменных, которые имеют периоды впереди, например, ".car" вместо "car", или я имею вручную соединить те с двумя переменными с помощью ['.'. join (x [2: 4])], чего я не хочу делать из-за изменчивости общего количества полей.

Мой желаемый вывод для данных примеров - две отдельные переменные, содержащие переменные из ввода

x = VARIABLE1 y = VARIABLE2
x = VARIABLE1.VARIABLE2 y = VARIABLE3
x = .VARIABLE1 y = VARIABLE2
x = VARIABLE1 y = VARIABLE2
x = .VARIABLE1 y= VARIABLE2

    x = re.split('\/', r)
    numElements = len(x)
    if(x[(numElements - 2)] == "STATICFIELD2"):
        y[x[2]] = 1
        else:
            x[2:4] = ['.'.join(x[2:4])]
        y[x[2]] = 1
    x = re.search(r'(\bSTATICFIELD1.STATICFIELD2.\b+)(\b.STATICFIELD3/\b)',line)

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Итак, на вопрос, который задают, я подозреваю, что вы потеряли сознание, потому что кто-то думает, что вы буквальны, когда вы говорите VARIABLE против STATICFIELD, потому что, если вы - это, вы, вероятно, могли бы подумать о переходе на использование findall.

Если это то, что вам нужно, должно сработать следующее, и вы можете обработать его

Редактировать: Вариант 1

>>> string = '''STATICFIELD1.STATICFIELD2.VARIABLE1.STATICFIELD3/VARIABLE2
STATICFIELD1.STATICFIELD2.VARIABLE1.VARIABLE2.STATICFIELD3/VARIABLE3
STATICFIELD1.STATICFIELD2..VARIABLE1.STATICFIELD3/VARIABLE2
STATICFIELD1.STATICFIELD2.VARIABLE1/VARIABLE2
STATICFIELD1.STATICFIELD2..VARIABLE1/VARIABLE2'''



>>> def isolate_variables(string):
        import re
        result = []
        for line in string.split('\n'):
            x,y = re.findall('(?i)(?:(?<=\s|\.|\/)|(?<=^))(VARIABLE[\d]+?[\.]+(?:VARIABLE[\d]*)+|(?:(?<=\s|\.|\/)|(?<=^))[\.]*VARIABLE[\d]+?)(?=[\.\/\n\ ]|$)', line)
            result.append((x,y))
        print(result)
        return result



>>> isolate_variables(string)



#OUTPUT
[('VARIABLE1', 'VARIABLE2'), ('VARIABLE1.VARIABLE2', 'VARIABLE3'), ('.VARIABLE1', 'VARIABLE2'), ('VARIABLE1', 'VARIABLE2'), ('.VARIABLE1', 'VARIABLE2')]

.

Вариант 2 - Вам просто нужно обработать после

>>> import re


>>> string = '''STATICFIELD1.STATICFIELD2.VARIABLE1.STATICFIELD3/VARIABLE2
STATICFIELD1.STATICFIELD2.VARIABLE1.VARIABLE2.STATICFIELD3/VARIABLE3
STATICFIELD1.STATICFIELD2..VARIABLE1.STATICFIELD3/VARIABLE2
STATICFIELD1.STATICFIELD2.VARIABLE1/VARIABLE2
STATICFIELD1.STATICFIELD2..VARIABLE1/VARIABLE2'''


>>> re.findall('(?i)(?:(?<=\s|\.|\/)|(?<=^))(VARIABLE[\d]+?[\.]+(?:VARIABLE[\d]*)+|(?:(?<=\s|\.|\/)|(?<=^))[\.]*VARIABLE[\d]+?)(?=[\.\/\n\ ]|$)', string)



#OUTPUT
['VARIABLE1', 'VARIABLE2', 'VARIABLE1.VARIABLE2', 'VARIABLE3', '.VARIABLE1', 'VARIABLE2', 'VARIABLE1', 'VARIABLE2', '.VARIABLE1', 'VARIABLE2']
0 голосов
/ 02 апреля 2019

Вы можете удалить шаблоны STATICFIELD из строки и затем выполнить простое разбиение по косой черте:

import re

def splitXY(s) : return re.sub("(\.?STATICFIELD\d+\.?)","",s).split("/")

x,y = splitXY("STATICFIELD1.STATICFIELD2.VARIABLE1.STATICFIELD3/VARIABLE2")
print(x,y)  # VARIABLE1 VARIABLE2
x,y = splitXY("STATICFIELD1.STATICFIELD2.VARIABLE1.VARIABLE2.STATICFIELD3/VARIABLE3")
print(x,y)  # VARIABLE1.VARIABLE2 VARIABLE3
x,y = splitXY("STATICFIELD1.STATICFIELD2..VARIABLE1.STATICFIELD3/VARIABLE2")
print(x,y)  # .VARIABLE1 VARIABLE2
x,y = splitXY("STATICFIELD1.STATICFIELD2.VARIABLE1/VARIABLE2")
print(x,y)  # VARIABLE1 VARIABLE2
x,y = splitXY("STATICFIELD1.STATICFIELD2..VARIABLE1/VARIABLE2")
print(x,y)  # .VARIABLE1 VARIABLE2

[ОБНОВЛЕНИЕ]

Если у вас есть логикаэто позволяет вам отличать имена, являющиеся STATICFIELD, от имен, которые являются переменными, вы можете использовать split и join для разбора ваших строк:

def isStatic(name): # this would be whatever logic distinguishes the names
    return name != "" and name.startswith("STATICFIELD")

def splitXY(s) :
    x,y = s.split("/")
    x =  ".".join(name for name in x.split(".") if not isStatic(name))
    return x,y

x,y = splitXY("STATICFIELD1.STATICFIELD2.VARIABLE1.STATICFIELD3/VARIABLE2")
print(x,y)  # VARIABLE1 VARIABLE2
x,y = splitXY("STATICFIELD1.STATICFIELD2.VARIABLE1.VARIABLE2.STATICFIELD3/VARIABLE3")
print(x,y)  # VARIABLE1.VARIABLE2 VARIABLE3
x,y = splitXY("STATICFIELD1.STATICFIELD2..VARIABLE1.STATICFIELD3/VARIABLE2")
print(x,y)  # .VARIABLE1 VARIABLE2
x,y = splitXY("STATICFIELD1.STATICFIELD2.VARIABLE1/VARIABLE2")
print(x,y)  # VARIABLE1 VARIABLE2
x,y = splitXY("STATICFIELD1.STATICFIELD2..VARIABLE1/VARIABLE2")
print(x,y)  # .VARIABLE1 VARIABLE2

Убедитесь, что isStatic() отвечает с False дляпустые имена

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...