免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 17969 | 回复: 8

如何从右向左逆向正则匹配? [复制链接]

论坛徽章:
0
发表于 2014-01-19 16:53 |显示全部楼层
本帖最后由 liaozd 于 2014-01-20 07:01 编辑

比如字符串:
s0 = "I_WTR1010someWord"
s1 = “I_WTR1010bg_v01.1010”
s2 = “I_WTR1010bg_v01.1010someWord”
s3 = “I_WTR1010bg_v01.321someWord”
我想匹配右侧第一次出现的1010,并且把字符串变成如下的tuple:
s0 > ("I_WTR", "1010","someWord" )
s1 > ("I_WTR1010bg_v01.", "1010")
s2 > ("I_WTR1010bg_v01.", "1010", "someWord")
s3 > (“I_WTR1010bg_v01.", "321", "someWord")
这样的正则该如何写?
1010只是代表任意的数字,可能重复出现几次,也可能只有一次,但我只需要从右侧出现的第一次分开

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2014-01-19 18:00 |显示全部楼层
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. #filepath=d:\test
  4. import re
  5. f=open(r"d:\test")
  6. lines=f.readlines()
  7. for line in lines:
  8.     list1=line.split("=")
  9.     k=re.sub(r"(1010)(?!.*1010.*)",r",\1,",list1[1].replace('"',''))
  10.     list2=k.strip().split(",")
  11.     if not list2[-1]:
  12.         del list2[-1]
  13.     print list1[0]+">",tuple(list2)
复制代码
输出:
  1. s0 > ('I_WTR', '1010', 'someWord')
  2. s1 > ('I_WTR1010bg_v01.', '1010')
  3. s2 > ('I_WTR1010bg_v01.', '1010', 'someWord')
复制代码

论坛徽章:
0
发表于 2014-01-19 18:42 |显示全部楼层
回复 2# TasteOracle

谢谢,不过我想的是是从“右侧”“逆向”匹配字符串


   

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
发表于 2014-01-19 19:20 |显示全部楼层
本帖最后由 timespace 于 2014-01-19 19:27 编辑

你只是想要结果上看似从右侧匹配的字符串,实际中正则引擎或字符串匹配算法没有从右侧迭代的。有两种办法,我倾向第一种,简单有效
  1. >>> ss = ['I_WTR1010someWord', 'I_WTR1010bg_v01.1010', 'I_WTR1010bg_v01.1010someWord', 'I_WTR1010bg_v01.321someWord']
  2. >>> for s in ss:
  3.         res = re.split('(\d+)', s)
  4.         if len(res) > 2:
  5.                 print ''.join(res[:-2]), res[-2], res[-1]

  6.                
  7. I_WTR 1010 someWord
  8. I_WTR1010bg_v01. 1010
  9. I_WTR1010bg_v01. 1010 someWord
  10. I_WTR1010bg_v01. 321 someWord
  11. >>> for s in ss:
  12.         res = re.search(r'(\d+)\D* $ ', s, re.X)
  13.         if res is not None:
  14.                 print s[:res.start(1)], s[res.start(1):res.end(1)], s[res.end(1):]

  15.                
  16. I_WTR 1010 someWord
  17. I_WTR1010bg_v01. 1010
  18. I_WTR1010bg_v01. 1010 someWord
  19. I_WTR1010bg_v01. 321 someWord
复制代码

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
发表于 2014-01-20 09:29 |显示全部楼层
本帖最后由 ssfjhh 于 2014-01-20 09:45 编辑

正则里没有左右,只有行首和行尾。@timespace:wink:
  1. In [33]: ss = ['I_WTR1010someWord', 'I_WTR1010bg_v01.1010', 'I_WTR1010bg_v01.1010someWord', 'I_WTR1010bg_v01.321someWord']

  2. In [34]: regex = re.compile('^(?P<first>.*?)(?P<second>\d+)(?P<third>\D*))

  3. In [35]: for s in ss:
  4.     ...:     print(regex.match(s).groups())
  5.     ...:     
  6. ('I_WTR', '1010', 'someWord')
  7. ('I_WTR1010bg_v01.', '1010', '')
  8. ('I_WTR1010bg_v01.', '1010', 'someWord')
  9. ('I_WTR1010bg_v01.', '321', 'someWord')
复制代码

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
发表于 2014-01-20 09:31 |显示全部楼层
本帖最后由 ssfjhh 于 2014-01-20 09:39 编辑

如果觉得没有必要给组命名,这样也可以。
  1. regex = re.compile('^(.*?)(\d+)(\D*))
复制代码
regex = re.compile('^(.*?)(\d+)(\D*)$')

搞不懂,为什么cu里这个插入代码的功能<>会吃掉部分代码。

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
发表于 2014-01-20 09:36 |显示全部楼层
s1 > ("I_WTR1010bg_v01.", "1010")
s1的结果不对,多输出了一个空字符串,但是你知道该怎么做了,对吧。

论坛徽章:
0
发表于 2024-01-31 08:36 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP