首页 > 解决方案 > 如何使用正则表达式正确解析复杂字符串中的元素

问题描述

我的数据可能采用某些格式,但无法正确解析。最初我使用 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)

标签: pythonregex

解决方案


因此,对于所问的问题,我怀疑您被叮了,因为有人认为您在说VARIABLEvs时是字面意思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']

推荐阅读