鱼C论坛

 找回密码
 立即注册
查看: 729|回复: 4

[已解决]小白关于字符串信息提取问题

[复制链接]
发表于 2019-4-22 19:06:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这个是目标内容

<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
    <path d="M 50 50 L 50 90 L 90 90 z" fill="red"/>
    <path d="M 160 170 L 160 130 L 120 130 z" fill="green"/>
    <path d="M 200 30 L 180 30 L 180 50 L 220 50 z" fill="blue"/>
    <path d="M 40 100 L 40 140 L 60 140 L 60 120 z" fill="yellow"/>
    <path d="M 210 70 L 230 90 L 270 90 L 270 50 L 230 50 z" fill="purple"/>
    <path d="M 180 130 L 180 170 L 220 210 L 240 190 z" fill="olive"/>
    <path d="M 100 200 L 120 180 L 80 140 L 80 180 z" fill="magenta"/>
</svg>



怎样提取信息到字典里{颜色1:[(坐标1)(坐标2)...],颜色2:[(坐标4)(坐标5)...]等等}

以第一组为例{red:[(50,50)(50,90)(90 ,90)]。。。。}
刚学python,数据和颜色的匹配总是不成功,总是不能把数字完整匹配到颜色里,因为每个颜色里的坐标数是随机的。有没有大佬帮助一下,写一下完整的,真的感谢
最佳答案
2019-4-22 19:57:12
本帖最后由 凌九霄 于 2019-4-22 19:59 编辑
  1. import re

  2. s = '''<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
  3.     <path d="M 50 50 L 50 90 L 90 90 z" fill="red"/>
  4.     <path d="M 160 170 L 160 130 L 120 130 z" fill="green"/>
  5.     <path d="M 200 30 L 180 30 L 180 50 L 220 50 z" fill="blue"/>
  6.     <path d="M 40 100 L 40 140 L 60 140 L 60 120 z" fill="yellow"/>
  7.     <path d="M 210 70 L 230 90 L 270 90 L 270 50 L 230 50 z" fill="purple"/>
  8.     <path d="M 180 130 L 180 170 L 220 210 L 240 190 z" fill="olive"/>
  9.     <path d="M 100 200 L 120 180 L 80 140 L 80 180 z" fill="magenta"/>
  10. </svg>'''

  11. color = {}
  12. regex = re.findall(r'd="([^"]+)"[^"]+"([^"]+)"', s)

  13. for i in regex:
  14.     color[ i[ 1 ] ] = [ tuple(map(int, x.split())) for x in re.findall(r'\d+\s*\d+', re.sub(r'M|L|z', '', i[ 0 ])) ]
  15.    
  16. print(color)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-22 19:57:12 | 显示全部楼层    本楼为最佳答案   
本帖最后由 凌九霄 于 2019-4-22 19:59 编辑
  1. import re

  2. s = '''<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
  3.     <path d="M 50 50 L 50 90 L 90 90 z" fill="red"/>
  4.     <path d="M 160 170 L 160 130 L 120 130 z" fill="green"/>
  5.     <path d="M 200 30 L 180 30 L 180 50 L 220 50 z" fill="blue"/>
  6.     <path d="M 40 100 L 40 140 L 60 140 L 60 120 z" fill="yellow"/>
  7.     <path d="M 210 70 L 230 90 L 270 90 L 270 50 L 230 50 z" fill="purple"/>
  8.     <path d="M 180 130 L 180 170 L 220 210 L 240 190 z" fill="olive"/>
  9.     <path d="M 100 200 L 120 180 L 80 140 L 80 180 z" fill="magenta"/>
  10. </svg>'''

  11. color = {}
  12. regex = re.findall(r'd="([^"]+)"[^"]+"([^"]+)"', s)

  13. for i in regex:
  14.     color[ i[ 1 ] ] = [ tuple(map(int, x.split())) for x in re.findall(r'\d+\s*\d+', re.sub(r'M|L|z', '', i[ 0 ])) ]
  15.    
  16. print(color)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-22 20:28:21 | 显示全部楼层

tuple(map(int, x.split()))   这个能简单解释一下吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-22 20:50:46 | 显示全部楼层
本帖最后由 凌九霄 于 2019-4-22 20:52 编辑
wp231957 发表于 2019-4-22 20:28
tuple(map(int, x.split()))   这个能简单解释一下吗


你要求元组数字坐标,而正则匹配出来的是列表字符串,所以转化了下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-23 05:26:13 | 显示全部楼层
正则表达式好有用啊~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-18 06:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表