Python 使用前向/后向空字符串拆分字符串
我试图在每个Python 使用前向/后向空字符串拆分字符串,python,regex,lookahead,Python,Regex,Lookahead,我试图在每个0或一组0之后拆分任何数字字符串,例如3.1415926535897932384626433832795028841971。但是,我希望在每组之后保留0 例如,字符串10203040506070809011应拆分为 ['10', '20', '30', '40', '50', '60', '70', '80', '90', '11'] ['3.14159265358979323846264338327950', '28841971'] 字符串3.14159265358979323
0
或一组0
之后拆分任何数字字符串,例如3.1415926535897932384626433832795028841971
。但是,我希望在每组之后保留0
例如,字符串10203040506070809011
应拆分为
['10', '20', '30', '40', '50', '60', '70', '80', '90', '11']
['3.14159265358979323846264338327950', '28841971']
字符串3.14159265358979323846264338327952028841971
应拆分为
['10', '20', '30', '40', '50', '60', '70', '80', '90', '11']
['3.14159265358979323846264338327950', '28841971']
我试图用正向查找和空字符串分开字符串:
import re
p = '(?<=0+)'
re.search(p, '102030405')
><_sre.SRE_Match object; span=(2, 2), match=''>
'102030405'.split(p)
>['102030405']
是否有任何方法可以基于空字符串的前向或后向拆分字符串?我问的是一般情况,而不仅仅是数字。例如,如果我想将
3:18am5:19pm10:28am
分割成不同的时间段,而不丢失am
或pm
,并得到一个数组['3:18am','5:19pm','10:28am']
,我该怎么做呢?使用re.findall
:
l = re.findall(r'(?<![^0])[1-9.]+0*', s)
l=re.findall(r'(?Pythonsplit
需要非零宽度匹配
您可以将findall
与此正则表达式一起使用以获取匹配项:
>>> print re.findall(r'([\d.]+?(?:0+|$))', '10203040506070809011')
['10', '20', '30', '40', '50', '60', '70', '80', '90', '11']
>>> print re.findall(r'([\d.]+?(?:0+|$))', '3.1415926535897932384626433832795028841971')
['3.14159265358979323846264338327950', '28841971']
([\d.]+?(?:0 |$)
匹配以0
或行尾结尾的数字或点
更新:
然而,我从您编辑的问题和评论中注意到,您正在寻找一个通用解决方案,以使用零宽度正则表达式模式进行拆分操作
我建议您安装非常有用的python。此模块的版本1提供了大部分PCRE功能,远远超过默认的re
模块
安装非常简单。只需从上面的链接下载tar gzip文件,然后运行:
sudo python setup.py install
从解压缩tar文件后获得的目录中删除(忽略安装过程中的一些警告)
安装regex
后,只需使用以下代码:
>>> import regex
>>> regex.DEFAULT_VERSION = regex.VERSION1
>>> regex.split(r'(?<=[ap]m)(?=.)', '3:18am5:19pm10:28am')
['3:18am', '5:19pm', '10:28am']
>>> print regex.split(r'(?<=0)(?=[1-9])', '10203040506070809011')
['10', '20', '30', '40', '50', '60', '70', '80', '90', '11']
>>> print regex.split(r'(?<=0)(?=[1-9])', '3.1415926535897932384626433832795028841971')
['3.14159265358979323846264338327950', '28841971']
>>> print regex.split(r'(?<=0)(?=[1-9])', '10020')
['100', '20']
导入正则表达式
>>>regex.DEFAULT_VERSION=regex.VERSION1
>>>split(r’(?中的这个简单正则表达式应该足够:
l = re.findall(r'[.1-9]+(?:0+|$)', s)
注:
findall
返回字符串中模式的所有非重叠匹配项,作为字符串列表
- 对于每个匹配,我们需要最长的数字串(或一个点),以至少一个零结尾,或字符串的结尾
- 末尾的零不应被捕获为另一个匹配项(因此
(?:…
)
第二个例子也是如此:
>>> re.findall(r'[\d:]+(?:am|pm|$)', '3:18am5:19pm10:28am')
['3:18am', '5:19pm', '10:28am']
无需使用lookahead/lookbehind magic或非贪婪匹配。Anubhava的答案是正确的。但是,它需要安装regex模块,这是不需要的
重新导入
pattern=r“(?您使用的是什么版本的python?当我尝试使用python 3.6.1运行re.search(p,'102030405')
时,出现了一个错误。您希望如何拆分10020
?['100',20']
,或者['10',020']
?['100',20']
;但是,您的正则表达式已经拆分了:)改变它也不难,谢谢!如果没有向前看或向后看,我真的永远不会有无法解决的情况吗?我最初的问题是将空字符串与特定的向前看/向后看匹配,但现在我想起来了,我无法想象在任何情况下,这是唯一的选择。是的是的。我们总是可以通过像本例中那样修改正则表达式来解决这个问题。对于python来说,允许匹配/分割为空或零宽度匹配肯定是件好事。