我在 python 中有这个字符串:
1 test11-1-swi-2 2 test11-swi-3 3 26-ca-20-p-3 4 26-ca-20-p-4
5 test11-labdist-rtr-1 6 test11-labdist-rtr-2 7 pmac-fw 8 pmac-swi
9 pmac-server 10 test11-swi-2 11 test-2400-rtr-6 12 test-2400-rtr-5
13 27-4c-da-p-13 14 27-4c-da-p-14 15 test11-1500-rtr
我想把它分成 x 个字符串,在这个例子中是 15 个,但它可以更多。
我试过使用:
[s.strip() for s in t.split(' ') if s]
占 2 个或更多空格,但某些子串仅相隔 1 个空格。
可行的是,
找到“1”,
然后找到“2”,
找到“2”后,创建一个从“1”到“2”之前的字符的子串
例如
1 test11-1-swi-2
2 test11-swi-3
3 26-ca-20-p-3
4 26-ca-20-p-4
5 test11-labdist-rtr-1
6 test11-labdist-rtr-2
7 pmac-fw
8 pmac-swi
9 pmac-server
10 test11-2400-swi-2
11 test-2400-rtr-6
12 test-2400-rtr-5
13 27-4c-da-p-13
14 27-4c-da-p-14
15 test11-1500-rtr
答案 0 :(得分:1)
您可以使用 re.split 并匹配 2 个或多个空白字符。
import re
from pprint import pprint
t = (" 1 test11-1-swi-2 2 test11-swi-3 3 26-ca-20-p-3 4 26-ca-20-p-4 \n"
" 5 test11-labdist-rtr-1 6 test11-labdist-rtr-2 7 pmac-fw 8 pmac-swi \n"
" 9 pmac-server 10 test11-swi-2 11 test-2400-rtr-6 12 test-2400-rtr-5\n"
" 13 27-4c-da-p-13 14 27-4c-da-p-14 15 test11-1500-rtr")
res = [s.strip() for s in re.split(r"\s{2,}", t) if s]
pprint(res)
输出
['1 test11-1-swi-2',
'2 test11-swi-3',
'3 26-ca-20-p-3',
'4 26-ca-20-p-4',
'5 test11-labdist-rtr-1 6 test11-labdist-rtr-2 7 pmac-fw',
'8 pmac-swi',
'9 pmac-server',
'10 test11-swi-2 11 test-2400-rtr-6 12 test-2400-rtr-5',
'13 27-4c-da-p-13',
'14 27-4c-da-p-14',
'15 test11-1500-rtr']
答案 1 :(得分:1)
我想出了一个 re.split()
使用:
\s*(?<!\S)(?=\d+ )
查看在线demo。
import re
s = """
1 test11-1-swi-2 2 test11-swi-3 3 26-ca-20-p-3 4 26-ca-20-p-4
5 test11-labdist-rtr-1 6 test11-labdist-rtr-2 7 pmac-fw 8 pmac-swi
9 pmac-server 10 test11-2400-oci-swi-2 11 test-2400-rtr-6 12 test-2400-rtr-5 13 27-4c-da-p-13 14 27-4c-da-p-14 15 test11-1500-cgbu-rtr"""
lst = list(filter(None,re.split(r'\s*(?<!\S)(?=\d+ )', s)))
print(lst) # ['1 test11-1-swi-2', '2 test11-swi-3', '3 26-ca-20-p-3', '4 26-ca-20-p-4', '5 test11-labdist-rtr-1', '6 test11-labdist-rtr-2', '7 pmac-fw', '8 pmac-swi', '9 pmac-server', '10 test11-2400-oci-swi-2', '11 test-2400-rtr-6', '12 test-2400-rtr-5', '13 27-4c-da-p-13', '14 27-4c-da-p-14', '15 test11-1500-cgbu-rtr']
答案 2 :(得分:1)
您可以使用 regex, \d+\s+[^\s]*
获取所有子字符串,而不是拆分它。
\d+
:一位或多位数字字符\s+
:一次或多次空白字符[^\s]*
:零次或多次任何非空白字符。演示:
import re
from pprint import pprint
s = """
1 test11-1-swi-2 2 test11-swi-3 3 26-ca-20-p-3 4 26-ca-20-p-4
5 test11-labdist-rtr-1 6 test11-labdist-rtr-2 7 pmac-fw 8 pmac-swi
9 pmac-server 10 test11-swi-2 11 test-2400-rtr-6 12 test-2400-rtr-5 13 27-4c-da-p-13 14 27-4c-da-p-14 15 test11-1500-rtr
"""
pprint(re.findall(r'\d+\s+[^\s]*', s))
输出:
['1 test11-1-swi-2',
'2 test11-swi-3',
'3 26-ca-20-p-3',
'4 26-ca-20-p-4',
'5 test11-labdist-rtr-1',
'6 test11-labdist-rtr-2',
'7 pmac-fw',
'8 pmac-swi',
'9 pmac-server',
'10 test11-swi-2',
'11 test-2400-rtr-6',
'12 test-2400-rtr-5',
'13 27-4c-da-p-13',
'14 27-4c-da-p-14',
'15 test11-1500-rtr']
答案 3 :(得分:0)
为简单起见使用 re.findall
:
import re
re.findall(r'\d+\s+.*?(?=\s|$)', s)
输出:
['1 test11-1-swi-2',
'2 test11-swi-3',
'3 26-ca-20-p-3',
'4 26-ca-20-p-4',
'5 test11-labdist-rtr-1',
'6 test11-labdist-rtr-2',
'7 pmac-fw',
'8 pmac-swi',
'9 pmac-server',
'10 test11-swi-2',
'11 test-2400-rtr-6',
'12 test-2400-rtr-5',
'13 27-4c-da-p-13',
'14 27-4c-da-p-14',
'15 test11-1500-rtr']
这个正则表达式的意思是:
\d+
\s+
.*?
(懒惰的方式)(?=\s|$)