正则表达式将自定义分隔符上的字符串拆分为特定单词

时间:2017-03-23 11:24:48

标签: regex python-2.7

我正在尝试为我创建的应用程序解析一些字符串。 我想用逗号分隔,只要它们后跟星号,而不包括第一次出现的特定单词,让我们说“条件”。因此,例如字符串:!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)',\*'进行正向预测,以逗号分隔后跟星号(不包括星号),但我似乎无法找到合适的星号。任何指针都会非常有用。

1 个答案:

答案 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']

请参阅online Python demo

<强>详情:

  • re.search(r"\*(CONDITION|MOREOPTIONS)", s) - 查找CONDITION的第一次出现(如果需要,添加更多| - 已分页的选项)
  • re.findall(r"(?:^|\*)[^*]+(?=,|$)", s[:x.start(1)]) - 如果匹配,请在匹配的CONDITION之前的字符串中查找所有不重叠的事件:
    • (?:^|\*) - 字符串开头或*
    • [^*]+ - 除*
    • 以外的1个或多个字符
    • (?=,|$) - 要求,或字符串结尾而不消费
  • res.append(s[x.start(1):]) - 只需在CONDITION之后附加部分。