鱼C论坛

 找回密码
 立即注册
查看: 2200|回复: 10

[已解决]数字的筛选 正则表达

[复制链接]
发表于 2020-9-28 09:08:08 | 显示全部楼层 |阅读模式

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

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

x
想筛选一些坐标里的数字(有些含负号'-'), 有没有什么正则可以方便的筛选的到,坐标如下:
  1. X-018702Y032874
  2. X025185Y-043027G85X025185Y-0422
  3. X025185Y-043027G84X025185
  4. X026772
  5. Y-043027
  6. R8M02X025185
复制代码


筛选结果如下:
  1. -018702, 032874
  2. 025185, -043027, 025185, -0422
  3. 025185, -043027
  4. 026772
  5. -043027
  6. 025185
复制代码
最佳答案
2020-9-28 09:31:06
  1. import re
  2. lst=['X-018702Y032874','X025185Y-043027G85X025185Y-0422','X025185Y-043027G84X025185','X026772','Y-043027','R8M02X025185']
  3. result=[]
  4. for string in lst:
  5.     result.append(re.findall(r'(?:X|Y)(-?\d+)',string))
  6. for each in result:
  7.     print(*each,sep=',')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-28 09:12:38 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-28 09:31:06 | 显示全部楼层    本楼为最佳答案   
  1. import re
  2. lst=['X-018702Y032874','X025185Y-043027G85X025185Y-0422','X025185Y-043027G84X025185','X026772','Y-043027','R8M02X025185']
  3. result=[]
  4. for string in lst:
  5.     result.append(re.findall(r'(?:X|Y)(-?\d+)',string))
  6. for each in result:
  7.     print(*each,sep=',')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-28 09:46:46 | 显示全部楼层
R8M02X这个是不是有点犯规 python的re模块可是不支持不定长环视的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-28 09:47:25 | 显示全部楼层
我自己写了一个, 但感觉有点啰嗦, 由于本人还没有学到正则表达, re模块粗略的看了一下, 请指教:
  1. zb = ['X-018702Y032874',\
  2.       'X025185Y-043027G85X025185Y-0422',\
  3.       'X025185Y-043027G84X025185',\
  4.       'X026772',\
  5.       'Y-043027',\
  6.       'R8M02X025185',\
  7.       'R8M02Y025185']

  8. for i in zb:
  9.     if 'G84' in i:
  10.         shu = i[1:i.index('G')]
  11.     elif 'G85' in i:
  12.         shu = i.replace('G85','')
  13.         shu = shu[1:]
  14.     elif i[0] == 'R' and 'M02' in i:
  15.         if 'X' in i:
  16.             shu = i[i.index('X')+1:]
  17.         if 'Y' in i:
  18.             shu = i[i.index('Y')+1:]
  19.     else:
  20.         shu = i[1:]

  21.     num = re.sub('[X,Y]',',',shu)
  22.     print(num)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-28 09:57:11 | 显示全部楼层
本帖最后由 kogawananari 于 2020-9-28 10:13 编辑
  1. import re
  2. print(re.findall(r'(?<=X|Y)-?\d+', s))
复制代码

环视这样也行 【R8M02X】保证最后一个是X就行
刚才忘记负数了 改一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-29 14:31:30 | 显示全部楼层

谢谢, 可以实现, 就是能不能过滤掉第三行"X025185Y-043027G84X025185"后面的"G84X025185", G84后面的坐标不要.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-29 14:33:00 | 显示全部楼层

另外, 正则中的r'(?:X|Y)(-?\d+)'与另一用户中的r'(?<=X|Y)-?\d+', 写法不一样, 结果是一样的, 有什么区别吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-29 14:33:33 | 显示全部楼层
kogawananari 发表于 2020-9-28 09:57
环视这样也行 【R8M02X】保证最后一个是X就行
刚才忘记负数了 改一下

正则中的r'(?<=X|Y)-?\d+'与另一用户中的r'(?:X|Y)(-?\d+)', 写法不一样, 结果是一样的, 有什么区别吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-29 22:23:39 | 显示全部楼层

我这是环视 他那是分组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-23 16:59:27 | 显示全部楼层
这几天抽空把正则学了一下, 在前面2位的基础上找到可以忽略G84后面的坐标, 如下.
  1. r'(?<!G84)(?:X|Y)(-?\d*)'
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 05:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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