我正试图用一些正则表达式拆分大文件。问题是我想在分割后在文本中保留分隔符,并且我试图在正则表达式的开头添加?=但是它不会分裂。我在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)
我在第二段代码中做错了什么?
答案 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)