我想将字符串拆分为一个列表(Python(,其中每个段要么完全是数字的,要么是完全非数字的
例子;
'100.200.300'
给['100', '.', '200', '.', '300']
'abc0foo!bar'
给['abc', '0', 'foo!bar']
'123'
给['123']
'foo'
给['foo']
输入可能以数字部分或非数字部分开头或结尾。结果,当联接在""
时,必须完整地重现原始输入。
如果我分裂例如d+
,我将保留非数字部分并丢失数字部分。我可以循环^(d+|D+)(.*)$
但这很烦人。
我可以(在单个表达式中(在边界上拆分并将所有字符串部分和非字符串部分保留在结果列表中吗?
您可以在正则表达式中使用正前瞻和后视的组合来确定可以拆分给定字符串的边界(分隔符(。用:
import re
matches = re.split(r'(?<=D)(?=d)|(?<=d)(?=D)', string)
给定字符串的结果matches
为:
['abc', '0', 'foo!bar'] # 'abc0foo!bar'
['100', '.', '200', '.', '300'] # '100.200.300'
['123'] # '123'
['foo'] # 'foo'
解释:
积极的背后看
(?<=D)
D
匹配任何不是数字的字符。
积极的展望
(?=d)
d
匹配数字(等于 [0-9](
正面的背后看
(?<=d)
d
匹配数字(等于 [0-9](
积极的展望
(?=D)
D
匹配任何不是数字的字符。
您可以测试正则表达式here
。