找到一个数字后跟一个空格并拆分字符串

时间:2021-05-04 20:59:02

标签: python-3.x regex string split

我在 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

4 个答案:

答案 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']

Python demo

答案 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|$)
相关问题