在分隔符旁边分割字符串

问题描述

标题似乎有点奇怪,但这是输入和输出的示例

'425557: Slime Poudrin 425564: Slime Poudrin 425566: Slime Poudrin 425590: Slime Poudrin'

应该成为

['425557: Slime Poudrin','425564: Slime Poudrin','425566: Slime Poudrin','425590: Slime Poudrin']

不幸的是,id的范围可以从100000到500000,所以我无法按数字进行拆分,因此需要将其保留在输出中。我假设我可以在':'的左边分割6个字符,但是我不知道该怎么做或寻找解决方案。另外,如果有任何办法也可以用Enter分割多行文本,但是我发现的解决方案似乎仍然要求您逐行输入文本。不适用于数百行文字。 我认为有一种使用正则表达式拆分的方法,但我不太了解。

解决方法

您可以使用正则表达式拆分文本

import re

text = '425557: Slime Poudrin 425564: Slime Poudrin 425566: Slime Poudrin 425590: Slime Poudrin'

splited = re.findall("\d*\:[^\d]*",text)

print(splited)

输出:

['425557: Slime Poudrin ','425564: Slime Poudrin ','425566: Slime Poudrin ','425590: Slime Poudrin']
,

您可以按数字的第一个出现进行拆分。然后在最后删除空白。

import re
test_str = '425557: Slime Poudrin 425564: Slime Poudrin 425566: Slime Poudrin 425590: Slime Poudrin'
## splits your string by first occurrence of any digit 0-9
split_text = re.findall('\d*\D+',test_str)
final_split_text = [words.strip() for words in split_text]

输出:

['425557: Slime Poudrin','425564: Slime Poudrin','425566: Slime Poudrin','425590: Slime Poudrin']
,

一个更复杂的正则表达式,其前瞻性为负,以在下一个“ \ d +:”序列处停止,从而允许在字符串中使用中间数字(但不允许数字加冒号)。由于负前瞻仅适用于单个当前字符,因此将其包装在具有1个或多个匹配项的非捕获组中。

>>> import re
>>> text = "425557: Slime Poudrin 425564: Slime Poudrin 425566: Slime Poudrin 425590: Slime Poudrin 417766: Ysage [Ver. 2Y2D]'s scalp 425566: Slime Poudrin"
>>> re.findall(r"(\d+: (?:.(?!\d+:))+)",text2)
['425557: Slime Poudrin','425590: Slime Poudrin',"417766: Ysage [Ver. 2Y2D]'s scalp",'425566: Slime Poudrin']
,

您可以使用re.split

import re

s = '425557: Slime Poudrin 425564: Slime Poudrin 425566: Slime Poudrin 425590: Slime Poudrin'

rgx = r' +(?=\d{6}: )'
print re.split(rgx,s)

Regex | Python code

正则表达式显示为“匹配一个或多个空格,后跟六个数字,后跟一个冒号”。 (?=\d{6}: )正向超前