首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何拆分字符串并将分隔符保存在其中

如何拆分字符串并将分隔符保存在其中
EN

Stack Overflow用户
提问于 2019-04-26 23:35:01
回答 3查看 90关注 0票数 1

@edzech问,如何才能将一根绳子分开,并将分隔符保存在其中。他的问题是标记为复本,而这里的方法与“重复”不同。

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

代码语言:javascript
运行
复制
['<abc>', 'd', '<e>', '<f>', 'ghi', '<j>']

而不是:

代码语言:javascript
运行
复制
['<', 'abc', '>' 'd', '<', 'e', '>', '<', 'f', '>', 'ghi', '<', 'j', '>']

使用split没有帮助,因为它将根据分隔符进行拆分。我们想把它与它的内容联系起来。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-27 07:45:39

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

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

代码语言:javascript
运行
复制
<[^<>]*>|(?:(?!<[^<>]*>).)+

解释

  • <[^<>]*>匹配打开<,然后0+时间不是>,然后是关闭>
  • |
  • (?:(?!<[^<>]*>).)+回火的贪婪标记,如果右边的不是开式直到结束模式,则匹配任何字符。

Regex演示 x- Python演示

例如:

代码语言:javascript
运行
复制
import re
content = "<abc>d<e><f>ghi<j>test><g>"
result = re.findall(r"<[^<>]*>|(?:(?!<[^<>]*>).)+", content)
print(result)

结果

代码语言:javascript
运行
复制
['<abc>', 'd', '<e>', '<f>', 'ghi', '<j>', 'test>', '<g>']
票数 1
EN

Stack Overflow用户

发布于 2019-04-26 23:36:16

这是解决办法。

代码语言:javascript
运行
复制
import re

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

print(result)

输出:

代码语言:javascript
运行
复制
['<abc>', 'd', '<e>', '<f>', 'ghi', '<j>']

解释:

  • regex <.*?>意味着与<content>匹配的所有内容
  • regex [^<>]+意味着其他一切

简单地说,findall将找到与<content>匹配的所有内容,否则,将找到其他所有匹配的内容。这样,内容将在不丢失分隔符的情况下被分割。

票数 1
EN

Stack Overflow用户

发布于 2019-04-27 00:59:02

我相信你可以在这个正则表达式中使用拆分

代码语言:javascript
运行
复制
(?<=>)(?=[a-z<])|(?<=[a-z>])(?=<)

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

它不过是两个选项的配对查找/提前断言。

扩容

代码语言:javascript
运行
复制
   (?<= > )                      # Behind a  >
   (?= [a-z<] )                  # Ahead either a-z or <
|                              # or,
   (?<= [a-z>] )                 # Behind either a-z or >
   (?= < )                       # Ahead a  <

更新

请注意,在版本3.7分裂之前的Python版本中

在一个空的匹配没有被正确地处理。

想必他们无法分辨出空的

字符串和/或如何在零宽度匹配上完成凸点。

好像他们把头从a**中拉出来,现在是3.7版,

所以给你..。

Demo

3.7.3版

代码语言:javascript
运行
复制
>>> import sys
>>> print( sys.version )
3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 21:26:53) [MSC v.1916 32 bit (Intel)]

代码

代码语言:javascript
运行
复制
>>> 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>']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55876007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档