如何使用 2 个拆分参数拆分字符串



示例:

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中做到这一点?

一种方法是将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')]

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

最新更新