拆分正则表达式不起作用的字符串

时间:2014-05-14 11:59:42

标签: regex python-3.x

我正试图用一些正则表达式拆分大文件。问题是我想在分割后在文本中保留分隔符,并且我试图在正则表达式的开头添加?=但是它不会分裂。我在Sublime中尝试过修改过的正则表达式,它正在那里工作。

文字是这样的:

2014年8月7日01:01:01 一些文字
Aug 07,2014 02:02:02 PM

所以,日期,然后一些文字和日期。我希望用正则表达式识别该日期的分割文本。

正则表达式的第一个版本,完全符合我的目的:

\w{3}\s\d{2}\,\s\d{4}\s\d{1,2}\:\d{2}\:\d{2}\s[AM|PM].)

Python中的代码就是:

allparts = re.compile(r'\w{3}\s\d{2}\,\s\d{4}\s\d{1,2}\:\d{2}\:\d{2}\s[AM|PM].').split(alltext)

添加?=后,它看起来像这样:

allparts2 =re.compile(r'(?=\w{3}\s\d{2}\,\s\d{4}\s\d{1,2}\:\d{2}\:\d{2}\s[AM|PM].)').split(alltext)

我在第二段代码中做错了什么?

3 个答案:

答案 0 :(得分:1)

抱歉,我的第一个回答是错误的:)尝试不添加?=,只将它放在括号中:

allparts2 =re.compile(r'(\w{3}\s\d{2},\s\d{4}\s\d{1,2}\:\d{2}\:\d{2}\s[AM|PM].)').split(alltext)

然后在没有编译的情况下尝试...

allparts2 = re.split('(\w{3}\s\d{2},\s\d{4}\s\d{1,2}\:\d{2}\:\d{2}\s[AM|PM].)', alltext)

使用时:

#!/usr/local/bin/python2.7
import re

alltext = "Aug 07, 2014 01:01:01 PM some text Aug 07, 2014 02:02:02 PM another text Aug 07, 2014 03:03:03 AM " 

allparts2 = re.split('(?=\w{3}\s\d{2},\s\d{4}\s\d{1,2}\:\d{2}\:\d{2}\s[AM|PM].)', alltext)
print(allparts2)

结果是:

Executing the program....
$python2.7 main.py
['Aug 07, 2014 01:01:01 PM some text Aug 07, 2014 02:02:02 PM another text Aug 07, 2014 03:03:03 AM ']

使用时:

#!/usr/local/bin/python2.7
import re

alltext = "Aug 07, 2014 01:01:01 PM some text Aug 07, 2014 02:02:02 PM another text Aug 07, 2014 03:03:03 AM "


allparts2 = re.split('(?:\w{3}\s\d{2},\s\d{4}\s\d{1,2}\:\d{2}\:\d{2}\s[AM|PM].)', alltext)

print(allparts2)

结果是:

Executing the program....
$python2.7 main.py
['', ' some text ', ' another text ', ' ']

使用时:

#!/usr/local/bin/python2.7
import re

alltext = "Aug 07, 2014 01:01:01 PM some text Aug 07, 2014 02:02:02 PM another text Aug 07, 2014 03:03:03 AM "


allparts2 = re.split('(\w{3}\s\d{2},\s\d{4}\s\d{1,2}\:\d{2}\:\d{2}\s[AM|PM].)', alltext)

print(allparts2)

结果是:

Executing the program....
$python2.7 main.py
['', 'Aug 07, 2014 01:01:01 PM', ' some text ', 'Aug 07, 2014 02:02:02 PM', ' another text ', 'Aug 07, 2014 03:03:03 AM', ' ']

只是为了比较不同的形式。

答案 1 :(得分:0)

似乎python的re.split()不会在零长度匹配上分裂。

然而,手册说

  

如果在模式中使用捕获括号,则模式中所有组的文本也将作为结果列表的一部分返回。

     

...

     

如果分隔符中有捕获组并且它在字符串的开头匹配,则结果将以空字符串开头。

所以你可以使用:

allparts2 = re.compile(r'(\w{3}\s\d{2}\,\s\d{4}\s\d{1,2}\:\d{2}\:\d{2}\s(?:AM|PM))')

匹配表达式被捕获组包围的位置(另请注意最后的非捕获组)。结果是:

['', 'Aug 07, 2014 01:01:01 PM', ' some text ', 'Aug 07, 2014 02:02:02 PM', ' another text ', 'Aug 07, 2014 03:03:03 AM', ' ']

然后,您可以通过对allparts[1], allparts[2]等进行分组来创建文件,等等(2n + 1,2n + 2)。

答案 2 :(得分:0)

虽然我不熟悉Python风格,Pythex给了我以下内容,我认为是正确的结果:

请参阅result

即使不是这些,你的正则表达式中有几件事我不知道是不必要的和/或不正确的。

  • 逗号不需要转义
  • 条件不是由[condo | cond2],而是括号(cond1 | cond2)
  • 您拥有的\s是可选的,因为正则表达式会捕获一个空白区域,如果您想要捕获例如空格空格字符,制表符,回车符,..

最后,您要添加的项目?=是预测,?:使其匹配,但不会使其成为您的捕获组的一部分。

试试这个正则表达式:(?:\ w {3} \ d {2},\ d {4},[\ d:] +(?:AM | PM))