python - 如何使用正则表达式正确解析复杂字符串中的元素
问题描述
我的数据可能采用某些格式,但无法正确解析。最初我使用 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)
解决方案
因此,对于所问的问题,我怀疑您被叮了,因为有人认为您在说VARIABLE
vs时是字面意思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']
推荐阅读
- android - RecyclerView 裁剪底部数据
- telerik - NativeScript 构建 ios 大尺寸 .ipa
- javascript - 如何使用Javascript单击图像按钮?
- php - apache 服务、mamp、.htaccess 的问题
- qt - 如果应用程序通过 cronjob 执行,Qt 输出(qDebug qWarning 等)将不起作用
- javascript - JavaScript:在 Firefox 上调整窗口大小时触发 mousemove
- r - R system() 的行为不像 cmd 本身
- java - 如何为各种类做一个结果活动
- c# - 嵌套对象上的 EqualityComparer
- python - Python Requests (Web Scraping) - 构建一个 cookie 以便能够查看网站中的数据