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

正则表达式请教

  •  
  •   soratadori · 2015-07-27 06:04:51 +08:00 · 3142 次点击
    这是一个创建于 3408 天前的主题,其中的信息可能已经有所发展或是发生改变。
    例子:
    HAPPY: A,B,囧,5,6,7,d,e
    p.s 冒号后面有空格 也可能是冒号前面有空格,然后大概有x个逗号(x+1个值)

    问题:如何替换任意两个逗号中的值?

    我试过用\1 \2来替换,在编辑器上这个功能可以用,但是在python里实现不了\1 \2会输出一个乱码。
    我还试过用零宽断言(?!)或(?<=),但是好像这个方法不能接像是(.*?)这样的表达式,所以也失败了...
    第 1 条附言  ·  2015-07-28 12:51:11 +08:00
    已经解决正则表达式的部分,用列表[]也能实现了,但是如何用字典{}实现(如12楼所说)?
    第 2 条附言  ·  2015-07-29 02:10:04 +08:00
    全部问题都解决了
    16 条回复    2015-07-29 10:41:25 +08:00
    iyangyuan
        1
    iyangyuan  
       2015-07-27 08:42:47 +08:00 via iPhone
    我觉得这种问题更适合用数据结构去解决。可以定义一个数组来存放所有的值,然后再用一个散列表,散列表中的key是数组中的每一个值,散列表的value是数组值所对应的下标数组(因为值可能重复,所以是数组),这样既可以快速检索某个值,又可以保持值的顺序,如果插入删除操作较多,可以用链表代替数组。
    msg7086
        2
    msg7086  
       2015-07-27 09:11:41 +08:00
    bramblex
        3
    bramblex  
       2015-07-27 09:19:55 +08:00
    @msg7086

    let me google that for you!/w\
    amaranthf
        4
    amaranthf  
       2015-07-27 09:37:25 +08:00
    python正则匹配之后的group是通过match object对象的group()函数来获取的,比如
    amaranthf
        5
    amaranthf  
       2015-07-27 09:42:11 +08:00
    晕,不小心多按了个键
    p=re.compile(r'12(.*)34(.*)')
    m=p.match('12abc34def')
    m.group(1)=='abc'
    m.group(2)=='def'
    m.start(1)==2
    m.end(1)==5
    slideclick
        6
    slideclick  
       2015-07-27 11:43:08 +08:00
    你最好把你失败的正则表达式写上,这就跟code一样,拿嘴说不明白
    henryon
        7
    henryon  
       2015-07-27 11:55:15 +08:00
    source code/destination information. then we can help you.
    vincenttone
        8
    vincenttone  
       2015-07-27 16:54:17 +08:00
    re.compile(r'([^, :]),').findall('HAPPY: A,B,囧,5,6,7,d,e ')

    楼主是这意思吗?前提是你后面的值里没有空格、逗号或者冒号。
    vincenttone
        9
    vincenttone  
       2015-07-27 16:56:53 +08:00
    re.compile(r'(?:[:\s,]{1}([^, :]))').findall('HAPPY: A,B,囧,5,6,7,d,e ')
    漏了e
    vincenttone
        10
    vincenttone  
       2015-07-27 16:57:27 +08:00
    说实话,不如直接切割后split了
    imn1
        11
    imn1  
       2015-07-27 17:44:19 +08:00
    正则要记住多用 r‘规则’
    因为没用 r 标记,所以\1 \2等被转义了(显示乱码)
    soratadori
        12
    soratadori  
    OP
       2015-07-28 06:52:22 +08:00
    多谢@imn1 @msg7086 ,正则表达式确实是因为 r' '的问题。但还是没成功,貌似"\1"这样的形式后面跟不了数字,code [r'\1\2'+'123456'] ,如果把123456更换成其他的东西就可以运行。

    谢@iyangyuan 和 @iyangyuan 提醒,我后来试了下用列表来解决这个问题:
    L1 = ['key1','key2'……]
    L2 = ['A','B','囧','5','6','7','d','e']
    先查询L1里keyn的位置,再修改l2对应位置上的值,最后再输出L2回字符串是可行的。勉强算是解决这问题了。

    但是感觉用列表来解决有点怪怪的,我又试了下用字典来弄,代码如下:
    L1 = ['key1','key2'……]
    L2 = ['A','B','囧','5','6','7','d','e']
    D1 = dict(zip(L1,L2))
    这样可以直接修改keyn的值(D1['keyn'] = ),而不用先查找keyn的位置再修改L2的值。但问题是,字典不会按照你设定的顺序(key1 key2……)排列-_-#,这样就没办法输出回字符串了。该怎么办?

    @iyangyuan 我对这块不是很熟悉,你说的是上面这个意思吗?
    soratadori
        13
    soratadori  
    OP
       2015-07-28 06:56:00 +08:00
    我正则表达式查找部分是写成这样的形式:
    r'(happy.*?:)((.*?,){n})(.*?)(,)((.*?,){m})(.*?)(,.*)',然后\4和\8部分为需要的内容
    msg7086
        14
    msg7086  
       2015-07-28 07:05:06 +08:00
    @soratadori 参照2楼的链接。我觉得已经说得很清楚了。
    soratadori
        15
    soratadori  
    OP
       2015-07-28 12:49:31 +08:00
    @msg7086 多谢,已解决
    PythonAnswer
        16
    PythonAnswer  
       2015-07-29 10:41:25 +08:00
    In [1]:
    # 字典实现

    import re
    from collections import OrderedDict

    In [2]:
    example = 'HAPPY: A,B,囧,5,6,7,d,e'

    In [3]:
    dict_values = re.sub(r'^.*\s*\:\s*', '', example).split(',')

    In [4]:
    dict_values

    Out[4]:
    ['A', 'B', '囧', '5', '6', '7', 'd', 'e']

    In [5]:
    OrderedDict(zip(range(len(dict_values)), dict_values))

    Out[5]:
    OrderedDict([(0, 'A'), (1, 'B'), (2, '囧'), (3, '5'), (4, '6'), (5, '7'), (6, 'd'), (7, 'e')])
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2805 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 07:27 · PVG 15:27 · LAX 23:27 · JFK 02:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.