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
angel725
V2EX  ›  Python

python3 每两位数字插一个空格,怎么实现

  •  
  •   angel725 · 2018-10-07 18:24:43 +08:00 · 6986 次点击
    这是一个创建于 2026 天前的主题,其中的信息可能已经有所发展或是发生改变。
    010609162526
    变成
    01 06 09 16 25 26

    没想出来该怎么做??
    39 条回复    2018-10-16 18:16:09 +08:00
    lopetver
        1
    lopetver  
       2018-10-07 18:32:09 +08:00
    https://blog.csdn.net/guaguastd/article/details/43525923

    方法应该有很多的,链接使用的是正则分割

    ps.答案是百度出来的
    whoami9894
        2
    whoami9894  
       2018-10-07 18:35:43 +08:00 via Android
    这也需要发贴问吗……
    KIMMG
        3
    KIMMG  
       2018-10-07 18:36:58 +08:00   ❤️ 1
    import re
    number = '010609162526'
    result = " ".join(re.findall(r'.{2}', number))
    print(result)



    ----------------------------------------------
    回复区竟然不支持 makedown
    zhidian
        4
    zhidian  
       2018-10-07 18:58:58 +08:00
    这玩意儿为啥要正则,搜搜 python 怎么 chunk 字符串不好吗?
    Les1ie
        5
    Les1ie  
       2018-10-07 19:02:12 +08:00
    为什么大家都要用正则 ..
    ```
    source = "0123456789"
    result = ''
    for order, ch in enumerate(source):
    result += ch
    if order % 2:
    result += ' '
    print(result)

    ```

    虽然我这样写总感觉不是很优雅
    whoami9894
        6
    whoami9894  
       2018-10-07 19:08:39 +08:00
    >>> f = lambda a : ' '.join([a[i:i+2] for i in range(0, len(a), 2)])
    >>> f("12343463463452523523534634643")
    '12 34 34 63 46 34 52 52 35 23 53 46 34 64 3'
    bankroft
        7
    bankroft  
       2018-10-07 19:09:51 +08:00 via Android
    @Les1ie 因为正则比较快,比较方便
    lcdtyph
        8
    lcdtyph  
       2018-10-07 19:23:15 +08:00 via iPhone
    ' '.join([a+b for a,b in zip(s[::2],s[1::2])])
    奇数个字符就单独处理一下最后一个字符
    或者用 izip_longest
    herozhang
        9
    herozhang  
       2018-10-07 19:24:58 +08:00
    需求不是很明确,是从左向右,还是从右向左?
    zzj0311
        10
    zzj0311  
       2018-10-07 19:38:39 +08:00 via Android
    怎么说遍历插空格也行吧。。
    xxx749
        11
    xxx749  
       2018-10-07 19:48:23 +08:00 via Android
    正则又怎么了?
    mathzhaoliang
        12
    mathzhaoliang  
       2018-10-07 20:37:20 +08:00
    一句话的事情:

    return " ".join(s[i: i+2] for i in range(0, len(s), 2))
    tairan2006
        13
    tairan2006  
       2018-10-07 21:00:35 +08:00 via Android
    这题也太简单了。。
    mathzhaoliang
        14
    mathzhaoliang  
       2018-10-07 21:00:53 +08:00
    @mathzhaoliang 不对,长度奇数没有考虑进去
    weyou
        15
    weyou  
       2018-10-08 00:52:53 +08:00
    @mathzhaoliang slice 对超过范围的 index 也是可以处理的,所以奇数长度是没有问题的
    ltoddy
        16
    ltoddy  
       2018-10-08 06:28:11 +08:00
    @Les1ie source[::2]
    JerryV2
        17
    JerryV2  
       2018-10-08 08:33:28 +08:00
    正则快? 比切片还快?
    mathzhaoliang
        18
    mathzhaoliang  
       2018-10-08 08:35:35 +08:00
    @weyou 是的,谢谢指出。
    des
        19
    des  
       2018-10-08 08:36:29 +08:00 via Android
    @JerryV2 写的快吧,也没人说是跑得快
    annielong
        20
    annielong  
       2018-10-08 08:53:13 +08:00
    关键正则这玩意儿是难者不会会者不难,
    JerryV2
        21
    JerryV2  
       2018-10-08 09:11:23 +08:00
    正则很好,但是请在合适的时候使用它
    这么个简单的东西没必要上正则,不见得写正则会比写切片快,论执行速度,更是不可能比切片快
    说正则快,不过是懒得思考,来个东西,正则能做,就用正则了
    也许说的有点多了,不喜欢看的人就直接跳过好了
    yufpga
        22
    yufpga  
       2018-10-08 09:14:04 +08:00
    s = '010609162526'
    result = [s[i:i+2] for i in range(0, len(s), 2)]
    gowk
        23
    gowk  
       2018-10-08 09:16:35 +08:00 via Android   ❤️ 1
    我觉得吧,不是我打击新人,这种能 google 出来的就不要发帖了,这都解决不了,你也不适合做程序员
    wizardoz
        24
    wizardoz  
       2018-10-08 09:26:33 +08:00
    ' '.join([a+b for a,b in zip(s[0::2], s[1::2])])
    cbiqih
        25
    cbiqih  
       2018-10-08 09:39:14 +08:00
    import re

    number = "123456789"
    result = re.findall("\d{1,2}", number)

    print(result) # ['12', '34', '56', '78', '9']
    imn1
        26
    imn1  
       2018-10-08 09:58:14 +08:00
    如果「没想到优雅写法」还好说
    「没想出来」就很糟糕了,因为实在太多方法了,一个都没想到?
    xpresslink
        27
    xpresslink  
       2018-10-08 10:34:53 +08:00   ❤️ 1
    真正用 Python 的人思维方式应该是这样的:

    >>> import textwrap
    >>> ' '.join(textwrap.wrap(text='010609162526', width=2))
    '01 06 09 16 25 26'
    Les1ie
        28
    Les1ie  
       2018-10-08 10:40:29 +08:00
    @ltoddy 想到了用 s[::2] 然而当时没想到用 join.. 于是退一步写了+=
    laqow
        29
    laqow  
       2018-10-08 11:04:26 +08:00 via Android
    这个是在黑这么简单的东西 python 怎么写性能都低的吧
    a494836960
        30
    a494836960  
       2018-10-08 11:25:22 +08:00
    /(\w{2})(?!\b)/g
    a494836960
        31
    a494836960  
       2018-10-08 11:26:00 +08:00
    js '1123123qweqw'.replace(/(\w{2})(?!\b)/g,'$1 ')
    vimiix
        32
    vimiix  
       2018-10-08 14:21:46 +08:00
    看样子是一组双色球号码~~
    woodensail
        33
    woodensail  
       2018-10-08 14:25:01 +08:00
    @JerryV2 正则本身就不是强调执行速度快,而是开发效率高。
    woodensail
        34
    woodensail  
       2018-10-08 14:27:40 +08:00
    一般的做法是这类需求正则方便做就先正则顶着,然后 profile 后针对热点区域的正则进行优化或换用其他方式实现。
    JCZ2MkKb5S8ZX9pq
        35
    JCZ2MkKb5S8ZX9pq  
       2018-10-08 15:54:43 +08:00
    我觉得切片比较好。不过提供个不同的思路玩玩
    ''.join([''.join(i) for i in zip(s, ['', ' '] * len(s))])
    zjlletian
        36
    zjlletian  
       2018-10-08 23:15:43 +08:00
    @gowk 其实这个看似简单的问题,实际上也有很多学问,虚心点看看别人怎么写的不好么?
    lsj8924
        37
    lsj8924  
       2018-10-09 00:32:53 +08:00
    对不住老铁们了,我是一个正则患者。
    ![]( )
    mingyun
        38
    mingyun  
       2018-10-14 14:10:27 +08:00
    @lsj8924 这个 6
    xiii1991
        39
    xiii1991  
       2018-10-16 18:16:09 +08:00 via iPhone
    我们也可以直接手打着一串东西,然后直接 print ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1018 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 19:58 · PVG 03:58 · LAX 12:58 · JFK 15:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.