繁体   English   中英

如何在不删除分隔符的情况下拆分字符串?

[英]How to split a string without removing the delimiter?

我知道这个问题过去已经得到了回答。 但是我仍然遇到困难,尽管我已经尝试应用我在网上找到的多个建议。 所以,我想要的很容易。 拆分此字符串

"__label__2:somedata" 

或者

"__label__43:somedata" 

并得到

['__label__2:', 'somedata'] 

或者

['__label__43:', 'somedata'].

这是我的代码:

import re
line = "__label__2:somedata"
p = re.split("(__label__{1,2}:)", line)
print (p)

但这不幸打印

['__label__2:somedata']

我在这里做错了什么?

您需要在正则表达式中添加 \\d+ ,如下所示:

(__label__\d+:)

这也允许您捕获所有数字,而不必列出所有可能的值......

"(__label__{1,2}:)"没有按照你的想法去做。 {1,2}请求__label__字符串重复 1 或 2 __label__而不是字符12

正确的语法是使用[12]

import re

re.split('(__label__[12]:)', "__label__2:somedata")

输出: ['', '__label__2:', 'somedata']

您似乎在拆分字符串和匹配其中的一部分之间犹豫不决。 两者都是可能的,但它们是不同的,并且具有不同的用例。

  1. 分裂:

    您只需拆分:并将分隔符添加到除最后一部分之外的所有部分:

     lst = line.split(':') mx = len(lst) - 1 result = [ s if i == mx else s + ':' for i, s in enumerate(lst)]
  2. 比赛:

    您必须匹配第一部分,并分别匹配该行的其余部分:

     m = re.match('(__label__\\\\d{1,2}:)(.*)', line) resul = m.groups()

如果您可以期望有 2 个以上的字段,您将拆分,如果您想控制第一个的模式,您将进行匹配。

您可以使用.partition

>>> s="__label__2:somedata"
>>> t=s.partition(':')
>>> [t[0]+t[1], t[2]]
['__label__2:', 'somedata']

如果你有一堆,你可以使用一个理解:

cases=("__label__2:somedata", "__label__43:somedata" )

>>> [[t[0]+t[1], t[2]] for t in map(lambda s: s.partition(':'), cases)]
[['__label__2:', 'somedata'], ['__label__43:', 'somedata']]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM