如果有正向前视和正向后视但没有分隔符,如何拆分字符串?

2024-09-22 20:21:19 发布

您现在位置:Python中文网/ 问答频道 /正文

示例:

s = "Thisissometext andthisissometext"

我想把文本分为“是”和“一些”:

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

如果我这样做:

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

不,是的

如果我这么做

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.

如果没有分隔符,如何拆分字符串??你知道吗


Tags: 文本re示例issomesplitvalueerrorrequires
3条回答

这里不是使用split,而是一个regex,您可以在re.findall中使用它来完成您的工作:

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

RegEx Demo

正则表达式分解:

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

如果您知道文本中不存在的字符,'@'这里是一种简单而快速的方法:

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

测试:

In [300]: %timeit s.replace('issome','is@some').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)

您需要较新的^{} 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))

相关问题 更多 >