我正在尝试为我创建的应用程序解析一些字符串。
我想用逗号分隔,只要它们后跟星号,而不包括第一次出现的特定单词,让我们说“条件”。因此,例如字符串:!Example,Value,1,*SPLIT_THIS=True,*AND_THIS=True,*CONDITION=Something/ELSE:!Example,Value,2,*DONT_SPLIT=True,*AND_NOT_THIS=True,*CONDITION=SomethingElse/ELSE:False
应分为:
["!Example,Value,1",
"*SPLIT_THIS=True",
"*AND_THIS=True", "*CONDITION=Something/ELSE:!Example,Value,2,*DONT_SPLIT=True,*AND_NOT_THIS=True,*CONDITION=SomethingElse/ELSE:False"]
所以,那里可能会有更多的“条件”和更多的逗号星号,但我只想分开直到第一次出现“CONDITION”。我尝试了(?=(CONDITION))
或(?=CONDITION)
与',\*'
进行正向预测,以逗号分隔后跟星号(不包括星号),但我似乎无法找到合适的星号。任何指针都会非常有用。
答案 0 :(得分:1)
你需要在这里应用特定的逻辑,因为一个正则表达式解决方案是不可能的(我们需要一个无限宽度的lookbehind来检查当前位置左边某处是否有CONDITION
,这是可能的仅限PyPi正则表达式模块。)
这是一个可能的解决方案:
import re
s = '!Example,Value,1,*SPLIT_THIS=True,*AND_THIS=True,*CONDITION=Something/ELSE:!Example,Value,2,*DONT_SPLIT=True,*AND_NOT_THIS=True,*CONDITION=SomethingElse/ELSE:False'
x = re.search(r"\*(CONDITION|MOREOPTIONS)", s)
res = []
if x:
res = re.findall(r"(?:^|\*)[^*]+(?=,|$)", s[:x.start(1)])
res.append(s[x.start(1):])
print(res)
# => ['!Example,Value,1', '*SPLIT_THIS=True', '*AND_THIS=True',
'CONDITION=Something/ELSE:!Example,Value,2,*DONT_SPLIT=True,*AND_NOT_THIS=True,*CONDITION=SomethingElse/ELSE:False']
<强>详情:
re.search(r"\*(CONDITION|MOREOPTIONS)", s)
- 查找CONDITION
的第一次出现(如果需要,添加更多|
- 已分页的选项)re.findall(r"(?:^|\*)[^*]+(?=,|$)", s[:x.start(1)])
- 如果匹配,请在匹配的CONDITION
之前的字符串中查找所有不重叠的事件:
(?:^|\*)
- 字符串开头或*
[^*]+
- 除*
(?=,|$)
- 要求,
或字符串结尾而不消费res.append(s[x.start(1):])
- 只需在CONDITION
之后附加部分。