如何拆分字符串并将分隔符保留在i中

2024-10-02 22:25:07 发布

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

@edzech问,怎么可能把一根绳子分开,把分隔符放在里面。他的问题是marked as duplicate,而这里的方法不同于“复制”。你知道吗

我们想要分割一个字符串,但是通过在其中保留分隔符,我们不希望它们被分开。 简而言之,对于<abc>d<e><f>ghi<j>,我们希望:

['<abc>', 'd', '<e>', '<f>', 'ghi', '<j>']

而不是:

['<', 'abc', '>' 'd', '<', 'e', '>', '<', 'f', '>', 'ghi', '<', 'j', '>']

使用split没有帮助,因为它将根据分隔符拆分。我们想把它附在它的内容上。你知道吗


Tags: 方法字符串内容assplitabc分隔符绳子
3条回答

在所提出的解决方案中,不属于一对的单个打开<或关闭>被排除在结果之外。你知道吗

如果您还想保留<>,您可以使用:

<[^<>]*>|(?:(?!<[^<>]*>).)+

解释

  • <[^<>]*>匹配开始<,然后0+次不>,然后是结束>
  • |
  • (?:(?!<[^<>]*>).)+如果右边不是开合模式,则匹配任何字符

Regex demo| Python demo

例如:

import re
content = "<abc>d<e><f>ghi<j>test><g>"
result = re.findall(r"<[^<>]*>|(?:(?!<[^<>]*>).)+", content)
print(result)

结果

['<abc>', 'd', '<e>', '<f>', 'ghi', '<j>', 'test>', '<g>']

这是解决办法。你知道吗

import re

content = "<abc>d<e><f>ghi<j>"
result = re.findall(r"<.*?>|[^<>]+", content)

print(result)

输出:

['<abc>', 'd', '<e>', '<f>', 'ghi', '<j>']

说明:

  • regex <.*?>表示匹配<content>的所有内容
  • regex [^<>]+表示其他一切

简而言之,findall将找到所有匹配的<content>,否则,将找到所有其他匹配的。这样,内容将被拆分,而不会丢失分隔符。你知道吗

我相信你可以用split和这个正则表达式

(?<=>)(?=[a-z<])|(?<=[a-z>])(?=<)

https://regex101.com/r/WNy5n9/1

它只不过是2个选项,带有成对的lookback/ahead断言。你知道吗

扩展

   (?<= > )                      # Behind a  >
   (?= [a-z<] )                  # Ahead either a-z or <
|                              # or,
   (?<= [a-z>] )                 # Behind either a-z or >
   (?= < )                       # Ahead a  <

更新
请注意,在3.7版之前的Python版本中,拆分
没有正确处理空匹配。
想必他们无法分辨空的
字符串和/或如何在零宽度匹配上沿凹凸。你知道吗

似乎他们从3.7版的a**中拔出了脑袋,
所以给你。。你知道吗

演示

版本3.7.3

>>> import sys
>>> print( sys.version )
3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 21:26:53) [MSC v.1916 32 bit (Intel)]

代码

>>> import re
>>> rx = re.compile( r"(?<=>)(?=[a-z<])|(?<=[a-z>])(?=<)" )
>>> s = "<abc>d<e><f>ghi<j>test><g>"
>>> x =  re.split( rx, s )
>>> print ( x )
['<abc>', 'd', '<e>', '<f>', 'ghi', '<j>', 'test>', '<g>']

相关问题 更多 >