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

想请教一个标记语言解析的正则表达式

  •  
  •   honmaple · 2017-10-17 16:27:41 +08:00 · 2086 次点击
    这是一个创建于 2593 天前的主题,其中的信息可能已经有所发展或是发生改变。
    import re
    
    regex = re.compile(r'(^| )=([^\s]*[^\s])=(\B|[\u4e00-\u9fa5])')
    text = '=1= = 2= =3 == = 4 = =5=, =6=* =7=三 =8=a =9=='
    
    print(regex.findall(text))
    

    需求: 两个等号之间不能以空格开头或结尾,第一个等号之前只能是空格或者每一行的开始位置,第二个等号之后可以是标点或者汉字或者每一行结束,不能是数字字母下划线

    想问一下为什么匹配不到 3 =

    期望输出

    [('', '1', ''),(' ','3 =','') (' ', '5', ''), (' ', '6', ''), (' ', '7', '三'), (' ', '9=', '')]
    

    实际输出

    [('', '1', ''), (' ', '5', ''), (' ', '6', ''), (' ', '7', '三'), (' ', '9=', '')]
    

    请教一下这该怎么修改?

    7 条回复    2017-10-18 23:44:58 +08:00
    okletswin
        1
    okletswin  
       2017-10-17 17:45:01 +08:00
    2010 年我认真的学习了正则表达式,各种高级特性,复杂字符串解析,但现在发现没什么用处
    工作中的数据处理都是以 json 交互,自定义要输出的数据格式

    第二个括号了没包括空格,尝试了两下没成功,不打算浪费时间了
    我觉得楼主还是看看怎么折腾下数据来源吧
    Lincoln12w
        2
    Lincoln12w  
       2017-10-17 20:39:08 +08:00
    匹配不到‘ 3 =’是因为([^\s]*[^\s])里面不能包含空格
    尝试了几下, 把‘ 3 =’包括进来,但是不满足最后一个
    我的表达式是`regex = re.compile(r'(^| )=(\S(?:\S*|.*?\S))=(\B|[\u4e00-\u9fa5])')`
    输出是`[('', '1', ''), (' ', '3 =', ''), (' ', '5', ''), (' ', '6', ''), (' ', '7', '三'), (' ', '8=a =9', '')]`
    Zzzzzzzzz
        3
    Zzzzzzzzz  
       2017-10-17 20:43:39 +08:00
    上 pyparsing 吧
    secondwtq
        4
    secondwtq  
       2017-10-17 21:07:40 +08:00
    @okletswin 正则表达式其实挺有用的,就是得注意啥时候该用啥时候不该用
    honmaple
        5
    honmaple  
    OP
       2017-10-18 09:31:36 +08:00
    @okletswin 数据源就是这样,想要解析标记语言

    @Lincoln12w Thank you,我再试试

    @Zzzzzzzzz 多谢提醒
    tidyoux
        6
    tidyoux  
       2017-10-18 16:02:03 +08:00
    中间的部分改成这样:
    ([^\s]*|[^\s]+.*?[^\s]+)
    honmaple
        7
    honmaple  
    OP
       2017-10-18 23:44:58 +08:00
    @tidyoux Thank you.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1030 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 22:54 · PVG 06:54 · LAX 14:54 · JFK 17:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.