正则表达式使用增加的数字序列Python

sfo*_*ney 9 python regex string sequential

说我有一个字符串:

teststring =  "1.3 Hello how are you 1.4 I am fine, thanks 1.2 Hi There 1.5 Great!" 
Run Code Online (Sandbox Code Playgroud)

我希望如下:

testlist = ["1.3 Hello how are you", "1.4 I am fine, thanks 1.2 Hi There", "1.5 Great!"]
Run Code Online (Sandbox Code Playgroud)

基本上,仅在增加的数字上进行分割,其中差值为.1(即1.2到1.3).

有没有办法用正则表达式分割它,但只捕获增加的序号?我在python中编写代码,以便为每个代码重复使用自定义re.compile()并且它很好但是非常笨拙.

像这样的东西(其中parts1_temp是字符串中xx数字的给定列表):

parts1_temp = ['1.3','1.4','1.2','1.5']
parts_num =  range(int(parts1_temp.split('.')[1]), int(parts1_temp.split('.')[1])+30)
parts_search = ['.'.join([parts1_temp.split('.')[0], str(parts_num_el)]) for parts_num_el in parts_num]
#parts_search should be ['1.3','1.4','1.5',...,'1.32']

for k in range(len(parts_search)-1):
    rxtemp = re.compile(r"(?:"+str(parts_search[k])+")([\s\S]*?)(?=(?:"+str(parts_search[k+1])+"))", re.MULTILINE)
    parts_fin = [match.group(0) for match in rxtemp.finditer(teststring)]
Run Code Online (Sandbox Code Playgroud)

但是男人是丑陋的.有没有办法在正则表达式中更直接地执行此操作?我想这是有人在某些方面想要正则表达式的功能,但我找不到任何关于如何解决这个问题的想法(也许纯正的正则表达式是不可能的).

ctw*_*els 2

此方法用于finditer查找 的所有位置\d+\.\d+,然后测试匹配在数值上是否大于前一个。如果测试为真,它将索引附加到indices数组中。

最后一行使用从此答案中获取的列表理解来拆分这些给定索引上的字符串。

原始方法

此方法确保前一个匹配项小于当前匹配项。这不是按顺序工作的,而是根据数字大小工作的。因此,假设一个字符串包含数字1.1, 1.2, 1.4,它会在每次出现时分裂,因为每个数字都大于最后一个数字。

请参阅此处使用的代码

import re

indices = []
string =  "1.3 Hello how are you 1.4 I am fine, thanks 1.2 Hi There 1.5 Great!"
regex = re.compile(r"\d+\.\d+")
lastFloat = 0

for m in regex.finditer(string):
    x = float(m.group())
    if lastFloat < x:
        lastFloat = x
        indices.append(m.start(0))

print([string[i:j] for i,j in zip(indices, indices[1:]+[None])])
Run Code Online (Sandbox Code Playgroud)

输出:['1.3 Hello how are you ', '1.4 I am fine, thanks 1.2 Hi There ', '1.5 Great!']


编辑

序贯法

此方法与原始方法非常相似,但是,在 的情况下1.1, 1.2, 1.4,它不会拆分,1.4因为它不会按顺序遵循给定.1的顺序分隔符。

下面的方法仅在if语句上有所不同,因此该逻辑可以根据您的需求进行自定义。

请参阅此处使用的代码

import re

indices = []
string =  "1.3 Hello how are you 1.4 I am fine, thanks 1.2 Hi There 1.5 Great!"
regex = re.compile(r"\d+\.\d+")
lastFloat = 0

for m in regex.finditer(string):
    x = float(m.group())
    if (lastFloat == 0) or (x == round(lastFloat + .1, 1)):
        lastFloat = x
        indices.append(m.start(0))

print([string[i:j] for i,j in zip(indices, indices[1:]+[None])])
Run Code Online (Sandbox Code Playgroud)