Python 正则表达式分割字符串为数字和文本/符号

3
我希望将一个字符串分成数字部分和文本/符号部分。我的当前代码不包括负数或小数,并且行为怪异,在输出的结尾添加了一个空列表元素。
import re
mystring = 'AD%5(6ag 0.33--9.5'
newlist = re.split('([0-9]+)', mystring)
print (newlist)

当前输出:

['AD%', '5', '(', '6', 'ag ', '0', '.', '33', '--', '9', '.', '5', '']

期望的输出:

['AD%', '5', '(', '6', 'ag ', '0.33', '-', '-9.5']

1
模式'(-?[0-9\.]+)'可以给你所需的输出,但也会有一些空字符串。 - ryugie
@ryugie 谢谢!您有任何想法,为什么它会添加一个空字符串? - ragardner
1
尝试使用 re.split(r'(-?\d*\.?\d+)', s),并使用 filter(None, result) 去除空值。 - Wiktor Stribiżew
1
@new_to_coding - 这是因为你正在使用数字作为分隔符,即在数字上进行拆分,所以它会添加一个空字符串,这就是分隔符之间的内容。数字只出现在列表中,因为你将模式放在括号中,所以你也捕获了分隔符。 - ryugie
@ryugie 非常有趣,谢谢。 - ragardner
@WiktorStribiżew,感谢您的回复,您的表达方式似乎也有效。如果你们两个都想提交你们的答案(如果你想的话),或者两个人都提交答案(附带短暂的对方解释)并给予信任,我会接受它。 - ragardner
3个回答

4
你的问题与正则表达式捕获一个或多个数字并将它们添加到结果列表有关,而数字被用作分隔符,这将导致在分隔结果中考虑前后部分。因此,如果末尾有数字,则会将空字符串添加到结果列表中。
你可以使用匹配带可选负号的浮点数或整数的正则表达式进行拆分,然后删除空值:
result = re.split(r'(-?\d*\.?\d+)', s)
result = filter(None, result)

为了匹配具有指数的正/负数,请使用:

使用以下方法:

r'([+-]?\d*\.?\d+(?:[eE][-+]?\d+)?)'
-?\d*\.?\d+正则表达式匹配:
  • -? - 可选的负号
  • \d* - 0个或多个数字
  • \.? - 可选的小数点符号
  • \d+ - 一个或多个数字.

2

很遗憾,re.split()没有提供“忽略空字符串”的选项。但是,为了检索您的数字,您可以使用不同的模式轻松地使用re.findall()

import re

string = "AD%5(6ag0.33-9.5"
rx = re.compile(r'-?\d+(?:\.\d+)?')
numbers = rx.findall(string)

print(numbers)
# ['5', '6', '0.33', '-9.5']

太棒了,谢谢你。虽然不完全符合我的需求,但对于提取数字非常有帮助。 - ragardner

1

如前所述,在re.split()中没有忽略空字符串的选项,但是您可以通过以下方式轻松构造一个新列表:

import re

mystring = "AD%5(6ag0.33--9.5"
newlist = [x for x in re.split('(-?\d+\.?\d*)', mystring) if x != '']
print newlist

输出:

['AD%', '5', '(', '6', 'ag', '0.33', '-', '-9.5']

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