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

这个正则该怎么写?

  •  
  •   omph · 2017-12-14 11:34:00 +08:00 · 3732 次点击
    这是一个创建于 2569 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有如下两种格式的信息,想提取名称和地址信息:

    1、供应商名称:肇 庆市锐装有限公司 2、法人 : 郑均 3、地址: 肇庆市梅庵路
    供应商名称:肇 庆市锐装有限公司 法人 : 郑均 地址: 肇庆市梅庵路

    如果这样写正则:供应商名称\s*:\s*(.{,30})\s*\d?.*?法人.{,40}?地址:\s*(\S+)
    对于第一种格式的结果会是:肇 庆市锐装有限公司 2、

    如果 ?能优先从 1 次而非 0 次开始匹配就好了
    14 条回复    2017-12-15 17:23:56 +08:00
    mengzhuo
        1
    mengzhuo  
       2017-12-14 11:39:02 +08:00   ❤️ 1
    不用正则……直接按值分隔,然后按数组取搞定了……

    一个问题用正则,现在你有两个问题了
    mineqiqi
        2
    mineqiqi  
       2017-12-14 11:44:58 +08:00
    @mengzhuo 没毛病
    polymerdg
        3
    polymerdg  
       2017-12-14 11:48:33 +08:00
    var_dump(explode(':',$str));
    geelaw
        4
    geelaw  
       2017-12-14 11:49:05 +08:00 via iPhone
    ? 确实是优先匹配 1 而不是 0。只要让 * 优先匹配更少的次数即可,方法是把 * 换为 *?
    vincenttone
        5
    vincenttone  
       2017-12-14 12:13:45 +08:00
    /名称:(.+?) .*地址:(.*)/
    如果 “肇 庆市锐装有限公司” 里面没有空格的话
    ffkjjj
        6
    ffkjjj  
       2017-12-14 14:19:38 +08:00
    String regex = "供应商名称\\s*:\\s*(.{0,30}\\D)(\\s2?)\\s*\\d?.*?法人.{0,40}?地址:\\s*(\\S+) ";
    ffkjjj
        7
    ffkjjj  
       2017-12-14 14:25:13 +08:00
    也可以这样,
    tring regex = "供应商名称\\s*:\\s*(.{0,30}\\s)(2?)\\s*\\d?.*?法人.{0,40}?地址:\\s*(\\S+) ";
    给 .{0,30} 一个 2 之前的结束标志就好了,就可以将 “肇 庆市锐装有限公司” 放在一个组里面。
    araraloren
        8
    araraloren  
       2017-12-14 14:47:46 +08:00
    I thought I was in sf.gg.
    wellCh4n
        9
    wellCh4n  
       2017-12-14 16:40:30 +08:00
    我觉得 先用正则 \d*、把序列编号用空格代替了之后用:和空格 kv 分割 比较方便啊。。
    laqow
        10
    laqow  
       2017-12-14 16:46:14 +08:00 via Android
    把空格标点数字全删了按几个标题字符断一下
    taofuan
        11
    taofuan  
       2017-12-14 17:15:34 +08:00
    得用环视吧
    (?<=供应商名称:).+(?=2、)|(?<=2、).+(?=3、)|(?<=3、地址:).+
    taofuan
        12
    taofuan  
       2017-12-14 17:16:22 +08:00
    改一下
    (?<=供应商名称:).+(?=2、)|(?<=2、法人 :).+(?=3、)|(?<=3、地址:).+
    yucongo
        13
    yucongo  
       2017-12-14 23:10:35 +08:00
    In [25]: s1 = '1、供应商名称:肇 庆市锐装有限公司 2、法人 : 郑均 3、地址: 肇庆市梅庵路 '

    In [26]: s2 = '供应商名称:肇 庆市锐装有限公司 法人 : 郑均 地址: 肇庆市梅庵路'

    In [27]: pat = re.compile(r'(?:\d、)?供应商名称:(\D+)(?:\d、)?法人 :.+地址:(.+)$')

    In [28]: pat.search(s1).groups()
    Out[28]: ('肇 庆市锐装有限公司 ', ' 肇庆市梅庵路 ')

    In [29]: pat.search(s2).groups()
    Out[29]: ('肇 庆市锐装有限公司 ', ' 肇庆市梅庵路')
    cnaol
        14
    cnaol  
       2017-12-15 17:23:56 +08:00
    > import re
    s1 = '1、供应商名称:肇 庆市锐装有限公司 2、法人 : 郑均 3、地址: 肇庆市梅庵路 '
    s2 = '供应商名称:肇 庆市锐装有限公司 法人 : 郑均 地址: 肇庆市梅庵路 '

    recom = re.compile(r'(?<=供应商名称:)(?P<company>[^ ]* ?[^ ]*).*(?<=法人 : )(?P<owner>[^ ]*).*(?<=地址: )(?P<addr>[^ ]*).*')
    print(recom.findall(s1))
    print(recom.findall(s2))

    ##############
    [('肇 庆市锐装有限公司', '郑均', '肇庆市梅庵路')]
    [('肇 庆市锐装有限公司', '郑均', '肇庆市梅庵路')]
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1015 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 21:58 · PVG 05:58 · LAX 13:58 · JFK 16:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.