用正则表达式处理字符串中的分组问题

碰到'122333<<<<'这种字符串,要将其连贯的部分取出,得出['1', '22', '333', '<<<<']这样的列表,能想到的常规办法,遍历字符串,后一个与前一个逐个比较,这样真的很麻烦!

实际上可以借助itertools模块的groupby()方法来处理:

import itertools

Str = '122333<<<<'
Lst = []
for key,group in itertools.groupby(s):
    Lst.append(list(group))

print map(lambda x: ''.join(x), Lst)

上面的处理,还是比较有技巧,也能得到想要的输出结果

['1', '22', '333', '<<<<']


但更酷点,更技巧处理方式是用正则表达式来处理:

import re

Str = '122333<<<<'
Lst = []

Pat = re.compile(r'((.)\2*)')
Rst = [x[0] for x in re.findall(Pat, Str)]

print Rst
备注:

1. (.)                # .匹配任意字符;(.)做分组,方便后面反向引用

2. \2*                # \2对里面括号的反向引用;*代表是0个到多个; 

3. ((.)\2*)           # 连起来就是任意一个或多个字符组成的分组;

4. (.)\1*             # 这种方式则可以取出唯一的值['1', '2', '3', '<'];同样非常方便


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值