示例:
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']]