在字符串中查找特殊的数字序列(坐标)

2024-06-28 19:56:14 发布

您现在位置:Python中文网/ 问答频道 /正文

在我们的项目中有两种坐标。 带x,y和z的法线

例如:

101, 520, 62
960.93 764.22 59.20

和6位扩展版本(2x xyz用于位置和旋转) 例如:

101 520 62 3 0 0
960.93 764.22 59.20 -0.34 0.00 -89.81

它们可以是负数,可以是浮点数,也可以是四舍五入数。 它们可以用逗号分隔,也可以不用逗号分隔

使用python,我试图找到字符串中的任何坐标

例如:

textbefore 101, 520, 62
GOTO 960.93 796.22 59.20 -0.34 0.00 -89.81
$5GOTO 1960.93 1796.22 159.20 -0.34 0.00 -89.81
501, 513, 162
1040, 1040, 520 text after 
error
222, 222
1500, 1500, 60  (1)
1337 1337 65
124.5, 133.6, 35.4
15:13:26  Condition: index_ != StringList::npos [line 178](125, 157, 215) 
Allocating shadow map cache 6324 x 6324: 76.28 MB

在理想情况下,输出应为:

101 520 62
960.93 796.22 59.20 -0.34 0.00 -89.81
1960.93 1796.22 159.20 -0.34 0.00 -89.81
501 513 162
1040 1040 520
1500 1500 60
1337 1337 65
124.5 133.6 35.4
125 157 215 

最后一行是“分配阴影贴图”,这有点棘手,如果失败并被列为坐标,那就好了

我在这里使用了这段代码,它对数字进行了很好的过滤,然后我检查了6或3个数字,但是我在有更多数字的行中遇到了问题。 所以我需要一个逻辑来检查是否有数字彼此“接近”,或者甚至是用文字分开

re.findall("[-+]?[.]?[\d]+(?:,\d\d\d)*[\.]?\d*(?:[eE][-+]?\d+)?", line)

如果可能的话,代码应该可以在Python2.7上运行(遗憾的是,我们远远落后)

谢谢


Tags: 项目字符串代码text版本line数字逗号
3条回答
s = '''textbefore 101, 520, 62
GOTO 960.93 796.22 59.20 -0.34 0.00 -89.81
$5GOTO 1960.93 1796.22 159.20 -0.34 0.00 -89.81
501, 513, 162
1040, 1040, 520 text after 
error
222, 222
1500, 1500, 60  (1)
1337 1337 65
124.5, 133.6, 35.4
15:13:26  Condition: index_ != StringList::npos [line 178](125, 157, 215) 
Allocating shadow map cache 6324 x 6324: 76.28 MB'''
s = s.split('\n')
s_row = []
for i in range(len(s)):
    s_row.append(s[i].replace(',', '').split(' '))

coord = []
for i in range(len(s_row)):
    coord_row = []
    for j in range(len(s_row[i])):
        try:
            s_row[i][j] = float(s_row[i][j])
            coord_row.append(s_row[i][j])
        except ValueError:
            None
    if coord_row != []:
        coord.append(coord_row)

将为您提供以下输出:


[[101.0, 520.0, 62.0]
[960.93, 796.22, 59.2, -0.34, 0.0, -89.81]
[1960.93, 1796.22, 159.2, -0.34, 0.0, -89.81]
[501.0, 513.0, 162.0]
[1040.0, 1040.0, 520.0]
[222.0, 222.0]
[1500.0, 1500.0, 60.0]
[1337.0, 1337.0, 65.0]
[124.5, 133.6, 35.4]
[157.0]
[6324.0, 76.28]]

您可以使用下面的正则表达式进行此操作

(?:(?:[+-]?\d+\.?\d*[ ,]+){5}[+-]?\d+\.?\d*)|(?:(?:[+-]?\d+\.?\d*[ ,]+){2}[+-]?\d+\.?\d*)

这将搜索以,space分隔的2/5个连续数字,以及具有非数字值的第3/6个数字

Here是一个演示

输出

['101, 520, 62',
 '960.93 796.22 59.20 -0.34 0.00 -89.81',
 '1960.93 1796.22 159.20 -0.34 0.00 -89.81',
 '501, 513, 162',
 '1040, 1040, 520',
 '1500, 1500, 60',
 '1337 1337 65',
 '124.5, 133.6, 35.4',
 '125, 157, 215']

在深入研究代码之前,您需要在psuedocode中找到一种算法或方法,它可以满足您的要求。 在本例中,您需要创建python代码来标识一个数字:

def is_number(input):
    if type(input) == int or type(input) == float:
        return True
    else:
        return False

然后我会在空格或逗号上拆分,并通过创建的数组进行解析,查找一行中的3或6个Trues

相关问题 更多 >