V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Bviews
V2EX  ›  Python

正则表达式求助

  •  
  •   Bviews · 2013-05-28 18:26:17 +08:00 · 3884 次点击
    这是一个创建于 4199 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有那么一个字符串
    15121:名字 [52-28]1,20-16,有一个字符串240110:字符串-------------45445:名字 [22-23]1,16-522,字符串3_34454545:字符串


    我想取出其中的
    (15121, 名字)以及 (45445,名字)

    相应的正则应该是怎么样呢?

    我尝试了几种方式

    re.findall(r'(\d+):(\D+)\[', string)

    这种虽然能够基本上满足,但是还是没法把名字后面的一长串空格给去除掉,关键是后面一段应该怎么改呢?
    第 1 条附言  ·  2013-05-28 19:19:40 +08:00
    已经解决,用re.findall(r'(\d+):(\D+?) ', string)就搞定了。
    12 条回复    1970-01-01 08:00:00 +08:00
    Bviews
        1
    Bviews  
    OP
       2013-05-28 18:27:02 +08:00
    ..系统吃掉了我的空格,备注: 名字后面有好几个空格。
    zhangxiao
        2
    zhangxiao  
       2013-05-28 18:40:54 +08:00   ❤️ 1
    ([\D^ ]+)
    不太用python,不知道对不对
    Bviews
        3
    Bviews  
    OP
       2013-05-28 19:10:26 +08:00
    @zhangxiao 不行..后面的空格还是没法去掉。。
    qdcanyun
        4
    qdcanyun  
       2013-05-28 19:11:40 +08:00   ❤️ 1
    用bpaste或者gist贴出来
    codepiano
        5
    codepiano  
       2013-05-28 19:17:47 +08:00   ❤️ 1
    @Bviews (\d+:[\D]+)(?= +\[) 用环视写了一个,不知道python里的语法会不会变
    funagi
        6
    funagi  
       2013-05-28 19:21:29 +08:00   ❤️ 1
    >>> s = ur'15121:名字 [52-28]1,20-16,有一个字符串240110:字符串-------------45445:名字 [22-23]1,16-522,字符串3_34454545:字符串'
    >>> re.findall(ur'(\d+):(\S{,4})\s+\[', s)
    [(u'15121', u'\u540d\u5b57'), (u'45445', u'\u540d\u5b57')]


    如果名字(人名?)长度可以限制的话……暂时只想到这个
    codepiano
        7
    codepiano  
       2013-05-28 19:21:31 +08:00   ❤️ 1
    @Bviews (\d+):(\D+)(?= +\[) 这个是按你的分组方式整理过的,用顺序肯定环视,可以不匹配空格和[符号
    Bviews
        8
    Bviews  
    OP
       2013-05-28 19:25:26 +08:00
    @funagi
    @codepiano
    @qdcanyun
    @zhangxiao

    已经解决,谢谢各位。
    re.findall(r'(\d+):(\D+?) ', string)就搞定了。
    用非贪婪模式就好了。
    banxi1988
        9
    banxi1988  
       2013-05-28 19:30:01 +08:00
    @Bviews not work.
    banxi1988
        10
    banxi1988  
       2013-05-28 19:35:10 +08:00   ❤️ 1
    @Bviews \s better than use for space,try this:
    r'\d+:\D+?\s{2,}?'
    sunshaozong
        11
    sunshaozong  
       2013-05-28 20:07:40 +08:00   ❤️ 1
    javascript 版本的: /(\d+:\D+?)\s*\[/.

    lz 自己写的版本, 确实可以吗? (我在javascript下测试不可以, python 下可以?)
    sunshaozong
        12
    sunshaozong  
       2013-05-28 20:31:26 +08:00
    ....

    没仔细看, 你的正则后面有一个空格. 可以正确匹配. 哈哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1628 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 16:52 · PVG 00:52 · LAX 08:52 · JFK 11:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.