在 Python 中的字符串中查找变化的子字符串

Finding a changing sub-string within a string in Python

我正在寻找一种从 Python 中的字符串中提取两个子字符串的方法。 我的字符串可以是以下4个例子之一:

"CRISTART 101 STATUS MODE joint POSJOINTCURRENT 3.19 3.01"
"CRISTART 101 STATUS MODE joint POSJOINTCURRENT -2.03 3.04"
"CRISTART 101 STATUS MODE joint POSJOINTCURRENT 3.06 -8.57"
"CRISTART 101 STATUS MODE joint POSJOINTCURRENT -5.26 -4.25"

供参考(这很重要)这些字符串实际上并不像上面提供的简化示例那么简单(为清楚起见),实际上一个字符串更像这样:

"CRISTART 111 STATUS MODE joint POSJOINTSETPOINT 3.19 3.01 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 POSJOINTCURRENT 3.19 3.01 0.00 0.00 0.00 0.00 0.00 
0.00 0.00 0.0 0.0 0.0 0.0 0.0 0.0 0.0 POSCARTROBOT 3.2 3.0 0.0 0.00 -0.00 0.00 POSCARTPLATTFORM 0.0 0.0 0.0 OVERRIDE 15.0 DIN 0 DOUT 0 ESTOP 3 SUPPLY 0 CURRENTALL 0 CURRENTJOINTS 4116 4116 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ERROR _MNE_LAG 20 20 0 0 0 0 0 0 0 4 4 4 4 4 4 4 KINSTATE 0 CRIEND\n"

我有兴趣在“POSJOINTCURRENT”之后提取两个值,在上面提供的第一个字符串示例中为“3.19”和“3.01”,在第二个字符串示例中为“-2.03”和“3.04”,“第三个字符串中的“3.06”和“8.57”,最后一个字符串中的“-5.26”和“-4.25”(注意负值前面可能有一个“-”符号,这是我目前努力实现的原因我要)。

要从此类字符串中提取这些数字,我目前正在使用此代码:

XStart = myString.find("POSJOINTCURRENT") + 16
XEnd = myString.find("POSJOINTCURRENT") + 20
Xcoord = mystring[XStart:XEnd]

YStart = myString.find("POSJOINTCURRENT") + 21
YEnd = myString.find("POSJOINTCURRENT") + 25
Ycoord = mystring[YStart:YEnd]

但是,由于可能出现“-”号,我的代码无法正常工作,因为我希望在这些数字为负数时正确提取它们(因为我希望潜在的“-”号以及全部提取 3 位数字(以及它们之间的“.”)。

欢迎就如何实现这一点提出任何想法。预先感谢您的帮助

您可以使用正则表达式:(-?[\d.]+) 将只匹配带有可选“-”的数字。然后只获取最后 2 个数字。

示例:

import re
string = "CRISTART 101 STATUS MODE joint POSJOINTCURRENT -5.26 -4.25"
print(re.findall('(-?[\d.]+)', string)[-2:])

输出:

['5.26', '-4.25']

使用 slice 方法获取最后两位数字,如下所示:

data = "CRISTART 101 STATUS MODE joint POSJOINTCURRENT 3.19 3.01"
result = data.split()[-2:] #Last two values
print(result)

输出:

['3.19', '3.01']

或者使用基于正则表达式的方法从多行字符串中提取所有点,如下所示:

data = '''
"CRISTART 101 STATUS MODE joint POSJOINTCURRENT 3.19 3.01"
"CRISTART 101 STATUS MODE joint POSJOINTCURRENT -2.03 3.04"
"CRISTART 101 STATUS MODE joint POSJOINTCURRENT 3.06 -8.57"
"CRISTART 101 STATUS MODE joint POSJOINTCURRENT -5.26 -4.25"
'''

import re
result = re.findall(r"(?<=POSJOINTCURRENT )(-?\d+.\d+)\s+(-?\d+.\d+)", data)
print(result)

输出:

[('3.19', '3.01'), ('-2.03', '3.04'), ('3.06', '-8.57'), ('-5.26', '-4.25')]

Result is a list of tuple(两个坐标的元组)

更基本的形式

string_1 = "CRISTART 101 STATUS MODE joint POSJOINTCURRENT 3.19 3.01"
string_2 = "CRISTART 101 STATUS MODE joint POSJOINTCURRENT -2.03 3.04"
string_3 = "CRISTART 101 STATUS MODE joint POSJOINTCURRENT 3.06 -8.57"
string_4 = "CRISTART 101 STATUS MODE joint POSJOINTCURRENT -5.26 -4.25"

strings = [string_1, string_2, string_3, string_4]
coords = []
for s in strings:
     splits = s.split(' ')
     x, y = splits[-2:]
     coords.append((x, y))

print(coords)