字符串分割,按数字位置进行分割。

3

我有这个字符串

a = "IN 744301 Mus Andaman & Nicobar Islands   01  Nicobar 638 Carnicobar 9.2333  92.7833 4"

我想使用正则表达式将这个内容分割,只要有数字,输出就应该像这样:
['IN' , '744301', 'Mus Andaman & Nicobar Islands', '01' , 'Nicobar', '638', 'Carnicobar', '9.2333','92.7833', '4' ]

你目前尝试了什么? - Underoos
3个回答

4
你可以使用“向前查看”和“向后查看”:
import re
a = "IN 744301 Mus Andaman & Nicobar Islands   01  Nicobar 638 Carnicobar 9.2333  92.7833 4"
new_a = re.split('(?<=\d)\s+|\s+(?=\d)', a)

输出:

['IN', '744301', 'Mus Andaman & Nicobar Islands', '01', 'Nicobar', '638', 'Carnicobar', '9.2333', '92.7833', '4']

正则表达式解释:

(?<=\d)\s+:匹配任何在数字 (\d) 之前的空格符 (\s)。

\s+(?=\d):匹配任何后跟数字的空白符。

|:应用具有匹配项的任一连接表达式。


你能详细解释一下这个正则表达式吗?谢谢。 - Python logix

1
你可以通过类似数字的模式进行拆分,然后使用相同的模式进行查找。由于split和findall是“姐妹”函数,因此您将获得非数字和数字片段。现在,将它们压缩成一个列表并消除空格。
from itertools import chain
# You can improve the regex to cover numbers that start with a .
NUMBER = r'\d+(?:\.\d*)?'  
combined = chain.from_iterable(zip(re.split(NUMBER, a),                                                        
                                   re.findall(NUMBER, a)))
result = [x for x in map(str.strip, combined) if x]
#['IN', '744301', 'Mus Andaman & Nicobar Islands', '01', 'Nicobar',
# '638', 'Carnicobar', '9.2333', '92.7833', '4']

1
你可以使用 re.split 并带上一个组(捕获括号),以便在结果中保留分隔符(数字):
>>> import re
>>> a = "IN 744301 Mus Andaman & Nicobar Islands   01  Nicobar 638 Carnicobar 9.2333  92.7833 4"
>>> re.split(r'(\d+(?:\.\d+)?)', a)
['IN ', '744301', ' Mus Andaman & Nicobar Islands   ', '01', '  Nicobar ', '638', ' Carnicobar ', '9.2333', '  ', '92.7833', ' ', '4', '']

你能详细解释一下这个正则表达式吗?谢谢。 - Python logix
在regex101.com上试一试。 - Laurent LAPORTE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接