Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用前向/后向空字符串拆分字符串_Python_Regex_Lookahead - Fatal编程技术网

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'(?Python
split
需要非零宽度匹配

您可以将
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来说,允许匹配/分割为空或零宽度匹配肯定是件好事。