【问题标题】:Regex split string on custom delimiter up to specific word自定义分隔符上的正则表达式拆分字符串到特定单词
【发布时间】:2017-03-23 11:24:48
【问题描述】:

我正在尝试为我制作的应用程序解析一些字符串。 我只想在逗号后面跟一个星号(不包括特定单词的第一次出现)时才用逗号分隔,比如说“条件”。所以,例如字符串:!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))(?=CONDITION)',\*' 这样的积极前瞻,以逗号分隔,后跟星号(不包括星号),但我似乎找不到合适的。任何指针都会非常有帮助。

【问题讨论】:

  • 你需要分几个步骤来完成,我不认为单个正则表达式可以用来实现这一点。
  • 检查ideone.com/rLvOsP,让您知道它是否适合您。
  • 几乎成功了!字符串的最后一部分(第二个 CONDITION 部分)应该以星号开头,但在本例中没有。谢谢你的快速回复,我很固执地认为我可以用一个表情让它工作,但显然这是不可能的。初始拆分就可以了。
  • 糟糕。我在这里看到一个较旧的链接。我分叉并修改了我的建议。恢复后我会发布。

标签: regex python-2.7


【解决方案1】:

您需要在此处应用特定逻辑,因为无法使用一个正则表达式解决方案(我们需要无限宽度的后视来检查当前位置左侧是否有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(如果需要,添加更多 |-seaprated 选项)
  • re.findall(r"(?:^|\*)[^*]+(?=,|$)", s[:x.start(1)]) - 如果匹配,则在匹配的 CONDITION 之前的字符串中查找所有不重叠的匹配项:
    • (?:^|\*) - 字符串开头或*
    • [^*]+ - 1 个或多个除 * 之外的字符
    • (?=,|$) - 需要 , 或字符串结尾而不使用它们
  • res.append(s[x.start(1):]) - 只是在CONDITION 之后附加部分。

【讨论】:

  • 感谢超快的回复,清晰的解释和指向无限宽后视的指针!我会对此进行一些后续阅读。
  • 这是一个您可以在 PyPi regex.split - (?<!,\*CONDITION=.*?),(?=\*) 中使用的正则表达式。但是,我不确定 PyPi 是否像 .NET 正则表达式引擎那样稳定。
  • 再次感谢您提供替代解决方案!这将用于生产服务器,因此您提供的解决方案坚如磐石!不过我会用 PyPi 做实验! :)
猜你喜欢
  • 1970-01-01
  • 2022-08-21
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 2011-02-24
  • 1970-01-01
相关资源
最近更新 更多