如果有积极的lookahead和积极的lookbehind而不是分隔符,我该如何分割一个字符串?

如果有积极的lookahead和积极的lookbehind而不是分隔符,我该如何分割一个字符串?

问题描述:

例子:如果有积极的lookahead和积极的lookbehind而不是分隔符,我该如何分割一个字符串?

s = "Thisissometext andthisissometext" 

我想之间的文本拆分 “是” 和 “一些”:

["Thisis", "sometext andthisis", "sometext"] 

如果我这样做:

re.split("(?<=is)s(?=ome)", s) 
--> ['Thisis', 'ometext andthisis', 'ometext'] 

没有 'S'

如果我这样做

re.split("(?<=is)(s)(?=ome)", s) 
--> ['Thisis', 's', 'ometext andthisis', 's', 'ometext'] 

如果我这样做

re.split("(?<=is)(?=some)", s) 
--> ValueError: split() requires a non-empty pattern match. 

我怎么可以拆分如果没有分隔字符串?

您需要支持空分裂的新regex module

import regex as re 

s = "Thisissometext andthisissometext" 

print(re.split(r"(?V1)(?<=is)(?=some)", s)) 
# ['Thisis', 'sometext andthisis', 'sometext'] 

注意这里的(?V1)这使新的行为。这可以通过一个标志设置,以及:

print(re.split(r"(?<=is)(?=some)", s, flags = re.VERSION1)) 
+2

Hoi Jan,很好的解决方案!从来没有听说过'(?V1)'哇。 – Reman

+2

@Reman:很高兴帮助。在答案的底部提供了另一种选择。 – Jan

而不是使用split的,这里要说的是,你可以在re.findall使用,让您的工作做了一个正则表达式:

>>> s = "Thisissometext andthisissometext" 
>>> print re.findall(r'[\w\s]+?(?:is(?=some)|$)', s) 
['Thisis', 'sometext andthisis', 'sometext'] 

RegEx Demo

RegEx分手:

  • [\w\s]+?:匹配1+字或空格字符(非贪婪
  • (?::启动非捕获组
    • is:匹配字面is
    • (?=some):即必须跟some
    • |:或
    • $:它是字符串的结尾
  • ):结束非捕获组

一种简单和快捷的方法,如果你知道在文本中不存在的人物,'@'这里它的工作原理:

s.replace('issome','[email protected]').split('@') 
# ['Thisis', 'sometext andthisis', 'sometext'] 

测试:

In [300]: %timeit s.replace('issome','[email protected]').split('@') 
976 ns ± 21.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) 

In [301]: %timeit regex.split(r"(?V1)(?<=is)(?=some)", s) 
7.36 µs ± 145 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) 

In [302]: %timeit re.findall(r'[\w\s]+?(?:is(?=some)|$)', s) 
4.28 µs ± 97.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) 
+0

感谢您的解决方案。非常好,但有时我需要正则表达式来分割我的字符串。 – Reman

+0

加上一个为timit! – Jan