我想使用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','']
感谢。
答案 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.2
,b
2. .
没有前导数字和尾随数字。 a.1.2
- &gt; a
,1.2
3. .
两边都没有数字a.-1
- &gt; a
,-1
4.所有个字符
1 2
- &gt; 1
,2
让我们了解条件是如何进入的
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']