【问题标题】:Python - escaping || when splitting string with multiple delimitersPython - 转义 ||使用多个分隔符拆分字符串时
【发布时间】:2016-04-09 12:34:13
【问题描述】:

我正在尝试使用 re.split 在 &&|| 上拆分像 a && b || c && d || e 这样的字符串。我知道你可以通过re.split("a | b") 来拥有多个分隔符,但是我不知道如何实现这一点:re.split("&& | ||")。我试图通过使用re.split("&& | \\|\\|") 来逃避管道,但这不起作用。

我如何正确地逃避这种情况?

【问题讨论】:

  • 请注意,您的正则表达式理解可能有误。 re.split("a | b") 将拆分为 a(space)(space)b。您自己的尝试也包括这些空格(它们恰好在您的输入中,因此它们将被丢弃)。
  • 你想要什么输出?

标签: python regex split


【解决方案1】:

你需要转义|,因为它有特殊含义:

>>> import re
>>> s = "a && b || c && d || e"
>>> re.split(r"&&|\|\|", s)
['a ', ' b ', ' c ', ' d ', ' e']

并且,还要处理分隔符周围的空格:

>>> re.split(r"\s(?:&&|\|\|)\s", s)
['a', 'b', 'c', 'd', 'e']

其中\s 匹配空格字符,(?:...)non-capturing group

【讨论】:

  • 将括号内的表达式标记为非捕获重要吗?
  • @RadLexus 是的,否则分隔符也会出现在结果列表中。谢谢。
  • 刚刚跑到我的桌面检查 :) 很好的警告!只是一个快速的后续问题:在我的 Python 2.7 上也可以在没有 r 前缀的情况下工作:re.split(" *&& *| *\|\| *", s) and 也可以使用双反斜杠!基本上,OPs 的原始尝试有效! (我在评论中提到了相关的空间问题。)有什么原因吗?
  • @RadLexus 这是原始字符串的“魔力”:stackoverflow.com/questions/12871066/…
【解决方案2】:

str.translate 如果您想拆分为单个元素,可能会完成这项工作:

s = "a && b || c && d || e"

print(s.translate(None,"&|").split())

这会给你:

['a', 'b', 'c', 'd', 'e']

或者替换双||用 && 然后拆分:

s = "a && b || c && d || e"

print(s.replace(" || "," && ").split(" && "))

或者如果你想保持间距,只要s.replace("||","&&").split("&&"),你可以使用上面的一些变体或结合str.strip

【讨论】:

    【解决方案3】:

    这个正则表达式是否满足您的需求?

    import re
    r = re.compile("(?:&&|\|\|)")
    r.split("a && b || c && d || e")
    

    结果:

    ['a ', ' b ', ' c ', ' d ', ' e']
    

    【讨论】:

      【解决方案4】:

      试试这个

      data = "a && b || c && d || e"
      import re
      spl = re.split("(?:\|\||&&)",data)
      print spl
      

      否则使用正则表达式否定查找全部

      import re
      data = "a && b || c && d || e"
      data2 = re.findall("[^&|]{2}",data)
      print data2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多