对于项目,我必须从文件中提取RGB值,其定义如下:
#71=IFCCOLOURRGB($,0.75,0.73,0.6800000000000001);
#98=IFCCOLOURRGB($,0.26,0.22,0.18);
我想重新调整RGB数据并将其写入一个新文件:
0.75 0.73 0.68
0.26 0.22 0.18
到目前为止,我已经为循环创建了这个:
import re
IfcFile = open('IfcOpenHouse.ifc', 'r')
IfcColourRGB = re.compile('ifccolourrgb', re.IGNORECASE)
for rad_rgb_data in IfcFile:
if re.search(IfcColourRGB, rad_rgb_data):
print(IfcColourRGB.sub('', rad_rgb_data))
返回:
#71=($,0.75,0.73,0.6800000000000001);
#98=($,0.26,0.22,0.18);
现在我对编程很陌生,我想知道我是否为我的任务选择了正确的方法,我一直在阅读正则表达式,但我不完全理解如何摆脱所有# =(,:字符以及如何准确指定要返回的数字以及哪些数字没有。是否可以显式/单独定义所有正则表达式并将它们组合在一个for循环中,以便我更容易理解它们?
答案 0 :(得分:2)
你可以使用re.findall()
带有正面的后视模式,然后用,
分割并转换为float:
>>> s="""#71=IFCCOLOURRGB($,0.75,0.73,0.6800000000000001);
... #98=IFCCOLOURRGB($,0.26,0.22,0.18);"""
>>> import re
>>> l=re.findall(r'(?<=\$,)[\d\.,]+',s)
>>> [map(float,i.split(',')) for i in l]
[[0.75, 0.73, 0.68], [0.26, 0.22, 0.18]]
答案 1 :(得分:0)
要提取颜色,请使用:
IFCCOLOURRGB\((?P<Red>\.[0-9]{1,16}|[0-9]+(?:\.[0-9]{1,16})?),(?P<Green>\.[0-9]{1,16}|[0-9]+(?:\.[0-9]{1,16})?),(?P<Blue>\.[0-9]{1,16}|[0-9]+(?:\.[0-9]{1,16})?)\)
捕获小组:
红色:红色值 绿色:绿色的价值, 蓝色:蓝色值
match = re.search(r"IFCCOLOURRGB\((?P<Red>\.[0-9]{1,16}|[0-9]+(?:\.[0-9]{1,16})?),(?P<Green>\.[0-9]{1,16}|[0-9]+(?:\.[0-9]{1,16})?),(?P<Blue>\.[0-9]{1,16}|[0-9]+(?:\.[0-9]{1,16})?)\)", subject)
if match:
result1 = match.group("Red")
result2 = match.group("Green")
result3 = match.group("Blue")
else:
result = ""
答案 2 :(得分:0)
我认为你是在思考这个问题:^)你可以遍历这些行并对每个行进行搜索。
import re
Searcher = re.compile("IFCCOLOURRGB\(\$,([\d\.]+),([\d\.]+),([\d\.]+)")
for Line in IfcFile:
Result = Searcher.search(Line)
if Result:
print Result.groups()
如果您只是将值写回文件,则除了截断00000001
并打印到2位有效数字之外,您不需要转换为浮点数。