如果有积极的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))
答
而不是使用split
的,这里要说的是,你可以在re.findall
使用,让您的工作做了一个正则表达式:
>>> s = "Thisissometext andthisissometext"
>>> print re.findall(r'[\w\s]+?(?:is(?=some)|$)', s)
['Thisis', 'sometext andthisis', 'sometext']
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)
Hoi Jan,很好的解决方案!从来没有听说过'(?V1)'哇。 – Reman
@Reman:很高兴帮助。在答案的底部提供了另一种选择。 – Jan