我想通过空格和句点使用python re.split()但是保持最后一个数字完整

时间:2017-09-28 18:12:59

标签: python regex

我想使用python re.split()按空格和句点将字符串拆分为单个字词,但我不希望将["1.2"]拆分为["1", "2"]

示例:

line = "AAA BBB.CCC.DDD BBB.CCC.DDD -0.03951979"

结果应为:

['AAA','BBB','CCC','DDD','BBB','CCC','DDD','-0.03951979']

我正在使用x = re.split('\W+',line)拆分它但结果并不是我想要的。

得到了['AAA','BBB','CCC','DDD','BBB','CCC','DDD','-0','03951979','']

感谢。

3 个答案:

答案 0 :(得分:3)

使用lookaround

import re
line ="AAA BBB.CCC.001 BBB.CCC.001 -0.03951979" 
res = re.split("(?<!\d)[.\s]|[.\s](?!\d)", line)
print(res)

<强>输出:

['AAA', 'BBB', 'CCC', '001', 'BBB', 'CCC', '001', '-0.03951979']

如果周围没有数字,这将在空格或点上分开。

根据评论进行编辑:

line = "AAA BBB.C01.001 BBB.C01.001 -0.03951979 "
res = re.findall(r"([-+]?\b\d+\.\d+\b|[a-zA-Z0-9]+)", line)
print(res)

<强>输出:

['AAA', 'BBB', 'C01', '001', 'BBB', 'C01', '001', '-0.03951979']

答案 1 :(得分:2)

https://regex101.com/r/TFObY0/1

(?<=\d)\.(?!\d)|(?<!\d)\.(?=\d)|(?<!\d)\.(?!\d)| 

请注意,这也不会拆分123.23.24。

如果一方不是数字或双方都不是数字,则仅将.作为分隔符。 将所有空间字符作为分隔符。

\W+替换为(?<=\d)\.(?!\d)|(?<!\d)\.(?=\d)|(?<!\d)\.(?!\d)|,以使其正常工作。

正则表达式解释
(?<=\d)\.(?!\d)|(?<!\d)\.(?=\d)|(?<!\d)\.(?!\d)|

我们在这里使用四个部分作为分隔符1|2|3|4
所以分别了解每个部分..
 1.带有前导数字而不是尾随数字的.1.2.b - &gt; 1.2b
 2. .没有前导数字和尾随数字。 a.1.2 - &gt; a1.2
 3. .两边都没有数字a.-1 - &gt; a-1
 4.所有个字符1 2 - &gt; 12

让我们了解条件是如何进入的

Lookbehinds

(?<=    #Positive lookbehind means leading condition for our dot has to lead with \d a digit
(?<!    #Negative lookbehind means should not lead with \d as a digit
(?=     #Positive lookahead means should trail with \d
(?!     #Negative lookahead means should not trail with \d

现在你了解了周围的情况,你将能够理解比赛的每个部分。

答案 2 :(得分:0)

这个怎么样?

re.findall('[+-]*[0-9]+\.[0-9]+|[^ ^.]+', line)

它首先找到小数点数(从/不开始+/-然后至少有一个数字,一个点,至少一个数字), 第二个找到不含空格和点的东西。

我得到了输出:

['AAA', 'BBB', 'CCC', 'DDD', 'BBB', 'CCC', 'DDD', '-0.03951979']