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

时间:2017-02-05 15:44:31

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

示例:

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中有更好的方法吗?

2 个答案:

答案 0 :(得分:6)

接近它的一种方法是使用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 :(得分: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']]