@edzech问,如何才能将一根绳子分开,并将分隔符保存在其中。他的问题是标记为复本,而这里的方法与“重复”不同。
我们希望拆分一个字符串,但是通过在其中保留分隔符,我们不希望分隔它们。简而言之,对于<abc>d<e><f>ghi<j>,我们希望:
['<abc>', 'd', '<e>', '<f>', 'ghi', '<j>']而不是:
['<', 'abc', '>' 'd', '<', 'e', '>', '<', 'f', '>', 'ghi', '<', 'j', '>']使用split没有帮助,因为它将根据分隔符进行拆分。我们想把它与它的内容联系起来。
发布于 2019-04-27 07:45:39
在所提出的解决方案中,不属于一对<的单个打开>或闭包<>被排除在结果之外。
如果您还想保留一个<或>,可以使用:
<[^<>]*>|(?:(?!<[^<>]*>).)+解释
<[^<>]*>匹配打开<,然后0+时间不是>,然后是关闭>|或(?:(?!<[^<>]*>).)+回火的贪婪标记,如果右边的不是开式直到结束模式,则匹配任何字符。例如:
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>']发布于 2019-04-26 23:36:16
这是解决办法。
import re
content = "<abc>d<e><f>ghi<j>"
result = re.findall(r"<.*?>|[^<>]+", content)
print(result)输出:
['<abc>', 'd', '<e>', '<f>', 'ghi', '<j>']解释:
<.*?>意味着与<content>匹配的所有内容[^<>]+意味着其他一切简单地说,findall将找到与<content>匹配的所有内容,否则,将找到其他所有匹配的内容。这样,内容将在不丢失分隔符的情况下被分割。
发布于 2019-04-27 00:59:02
我相信你可以在这个正则表达式中使用拆分
(?<=>)(?=[a-z<])|(?<=[a-z>])(?=<)https://regex101.com/r/WNy5n9/1
它不过是两个选项的配对查找/提前断言。
扩容
(?<= > ) # 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版
>>> 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>']https://stackoverflow.com/questions/55876007
复制相似问题