【问题标题】:How to split up a string using 2 split parameters?如何使用 2 个拆分参数拆分字符串?
【发布时间】:2017-06-22 13:54:40
【问题描述】:

例子:

r="\\%4l\\%(wit.*wit\\)\\|\\%8l\\%(rood.*rood\\)\\|\\%12l\\%(blauw.*blauw\\)\\|\\%13l\\%(wit.*wit\\)\\|\\%14l\\%(blauw.*blauw\\)\\|\\%15l\\%(wit.*wit\\)\\|\\%16l\\%(wit.*wit\\)\\|\\%17l\\%(rood.*rood\\)\\|\\%19l\\%(wit.*wit\\)\\|\\%21l\\%(blauw.*blauw\\)"

我想将字符串拆分为一个列表,但不是使用 1 个参数,而是使用 2 个参数。

  • 首先我要捕获l\\%(之前的数字
  • 其次我想捕获\\%(\\)\\|之间的文本或者 在\\%(\\)$ 之间的字符串结尾的情况下

输出:

[[4, "wit.*wit"], [8, "rood.*rood"], [12, "blauw.*blauw"], [13, "wit.*wit"], [14, "blauw.*blauw"], [15, "wit.*wit"], [16,"wit.*wit"], [17, "rood.*rood"], [19, "wit.*wit"], [21, "blauw.*blauw"]]

我尝试在\\| 处拆分字符串,然后用"" 替换每个不需要的字符。

有没有更好的方法在 Python 中做到这一点?

【问题讨论】:

    标签: python regex list python-3.x split


    【解决方案1】:

    一种方法是使用re.findall() 和两个捕获组来找到所需的对:

    In [3]: re.findall(r"%(\d+)l\\%\((.*?)\\\)", r)
    Out[3]: 
    [('4', 'wit.*wit'),
     ('8', 'rood.*rood'),
     ('12', 'blauw.*blauw'),
     ('13', 'wit.*wit'),
     ('14', 'blauw.*blauw'),
     ('15', 'wit.*wit'),
     ('16', 'wit.*wit'),
     ('17', 'rood.*rood'),
     ('19', 'wit.*wit'),
     ('21', 'blauw.*blauw')]
    

    【讨论】:

    • 很好的解决方案。谢谢你。只是一件事.. .* 之间可能有超过 1 个“()”,这就是为什么我要捕获 \\%(\\)\\| 之间的文本,或者如果 \\%( 和 @ 之间的字符串结尾987654327@。在您的正则表达式中,它介于 \\%(\\)
    • @Reman 谢谢,你能给我一个示例字符串吗?我认为可以用\(+量词解决,但想先测试一下。
    • 当然.. 示例字符串\%4l\%(wit\(.*\)wit\)\|\%8l\%(\(rood.*rood\)\)\|\%12l\%(blauw.*blauw\) 我只是想确保选择正确的\)。希望我说清楚了 :) 但是我想我已经找到了解决方案.. regex.findall(r"%(\d+)l\\%\((.*?)\\\)(?=\\\||$)", r)
    【解决方案2】:

    findall() 可能是最好的解决方案。

    这是一个相对较短的方法,用 2 个拆分且不替换:

    string = r"\%4l\%(wit.*wit\)\|\%8l\%(rood.*rood\)\|\%12l\%(blauw.*blauw\)\|\%13l\%(wit.*wit\)\|\%14l\%(blauw.*blauw\)\|\%15l\%(wit.*wit\)\|\%16l\%(wit.*wit\)\|\%17l\%(rood.*rood\)\|\%19l\%(wit.*wit\)\|\%21l\%(blauw.*blauw\)"
    
    pairs = [substring[2:-2].split(r"l\%(") for substring in string.split(r"\|")]
    # [['4', 'wit.*wit'], ['8', 'rood.*rood'], ['12', 'blauw.*blauw'], ['13', 'wit.*wit'], ['14', 'blauw.*blauw'], ['15', 'wit.*wit'], ['16', 'wit.*wit'], ['17', 'rood.*rood'], ['19', 'wit.*wit'], ['21', 'blauw.*blauw']]
    

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 2013-01-14
      • 2018-09-10
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 2021-05-16
      相关资源
      最近更新 更多