免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2477 | 回复: 6
打印 上一主题 下一主题

python 正则表达式 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-05-26 16:07 |只看该作者 |倒序浏览
多个 以a开头 以z结尾 中间任意数字 组成的字符串
比如 a111za222za333z 我想写个函数 来处理这个字符串 返回3个数字字符串
ss = func('a111za222za333z') --> ss = '111','222','333'
用正则表达式 如何写这个函数啊

论坛徽章:
0
2 [报告]
发表于 2015-05-26 17:48 |只看该作者
本帖最后由 huangxiaohen 于 2015-05-26 18:11 编辑

s = "s111b222dereisij33sds444"
a = re.findall(r'[0-9]{3}', s)
print a

<<['111', '222', '444']

论坛徽章:
0
3 [报告]
发表于 2015-05-26 19:01 |只看该作者
本帖最后由 nopolar 于 2015-05-27 06:14 编辑

我说任意数字 只是为了更清晰的描述问题 不是为了仅仅找出3个数字字符串
问题的关键是 如何用正则表达式描述 任意个以特定字符开始和结束的字符串组合

match = re.match(r'^(a\d+z)+$', str)
用这个 可以匹配 字符串是否符合模式 但group(1)只能返回最后一次括号匹配 即a333z
现在 只好再 findall 一次了

论坛徽章:
0
4 [报告]
发表于 2015-05-27 16:43 |只看该作者
a=re.findall(r'[0-9]+',s)                  ?

论坛徽章:
0
5 [报告]
发表于 2015-05-27 17:51 |只看该作者
那样写也可以
if re.match(r'^(a\d+z)+$', s):
    ss = re.findall(r'a\d+z', s)
    for s in ss:
        print s[1:-1]

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
6 [报告]
发表于 2015-05-27 18:00 |只看该作者
本帖最后由 substr函数 于 2015-05-27 18:03 编辑

match 一次
+ findall 一次
+ 写这个模式 一次






import re


def repeat(s, p):
    true = re.match(r'^({})+$'.format(p), s)
    return re.findall(p, s) if true else None


s = "a111za222za333z"

pat = r'a(\d{1,})z'

print repeat(s, pat)
# ['111', '222', '333']

s2 = "a111za222za333x"

print repeat(s2, pat)
# None

s3 = "a111za222zaz"
print repeat(s3, pat)
# None

s4 = "a111za222za22x2z"
print repeat(s4, pat)
# None

pat2 = r'(a\d{1,}z)'
print repeat(s, pat2)
# ['a111z', 'a222z', 'a333z']

print repeat(s2, pat2)
# None
print repeat(s3, pat2)
# None
print repeat(s4, pat2)
# None

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
7 [报告]
发表于 2015-05-28 08:34 |只看该作者
回复 1# nopolar
可以这样:
  1. import re
  2. content = "a111za22772za32133z"
  3. result = map(int, re.findall("a(\d+)z", content))
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP