示例:
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中有更好的方法吗?
答案 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']]