请教一个正则匹配多行问题的 - 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
TOUJOURSER

请教一个正则匹配多行问题的

  •  
  •   TOUJOURSER Nov 14, 2019 3408 views
    This topic created in 2371 days ago, the information mentioned may be changed or developed.

    文本内容:

     network-object host 109.17.49.131 object-group network KaGuan_12 network-object host 109.17.26.11 network-object host 109.17.26.12 object-group network ShangHai network-object host 110.1.60.91 network-object host 110.1.60.92 network-object host 110.1.172.31 network-object host 110.1.172.32 network-object host 110.238.250.57 network-object host 110.238.250.58 object-group network wangguan_test network-object host 111.17.13.32 object-group network wangguan_app_2 network-object host 111.17.9.54 network-object host 111.17.9.63 

    我现在想通过 110.1.172.32 这个字符串 匹配到 object-group network 后面的 ShangHai 这个关键词, 请问正则怎么写? 感谢各位大佬

    12 replies    2019-11-15 09:43:43 +08:00
    lululau
        1
    lululau  
       Nov 14, 2019 via iPhone
    正则正则,起码把规则说出来啊,你只举一个特例,那你直接把这个特例写成字符串字面量就可以了,不需要正则啊,再说,你这个说的 110.1.172.32 后面也没有 shanghai 啊
    TOUJOURSER
        2
    TOUJOURSER  
    OP
       Nov 14, 2019
    @lululau 不好意思描述的不太清楚, 规则是根据 ip 去获取该 ip 所属于的 group.
    我想通过 110.1.172.32 去向上查找以"object-group network "开头的那一行最后的 ShangHai 字符.
    araraloren
        3
    araraloren  
       Nov 14, 2019
    自己字符串直接查找不行么,如果是在练习正则的话当我没说。。
    ClericPy
        4
    ClericPy  
       Nov 14, 2019
    import re

    string = r'''network-object host 109.17.49.131
    object-group network KaGuan_12
    network-object host 109.17.26.11
    network-object host 109.17.26.12
    object-group network ShangHai
    network-object host 110.1.60.91
    network-object host 110.1.60.92
    network-object host 110.1.172.31
    network-object host 110.1.172.32
    network-object host 110.238.250.57
    network-object host 110.238.250.58
    object-group network wangguan_test
    network-object host 111.17.13.32
    object-group network wangguan_app_2
    network-object host 111.17.9.54
    network-object host 111.17.9.63'''
    ip = '110.1.172.32'.replace('.', r'\.')
    result = re.search(
    rf'object-group network (.*?)\n[\s\S]*?network-object host {ip}',
    string)
    if result:
    print(result.group(1))
    else:
    print('Not found.')


    KaGuan_12
    TOUJOURSER
        5
    TOUJOURSER  
    OP
       Nov 14, 2019
    @ClericPy 感谢, 你写的这个只可以匹配出 KaGuan_12 , 但是我需要的是 ShangHai, 110.1.172.32 是属于 ShangHai group
    todd7zhang
        6
    todd7zhang  
       Nov 14, 2019   2
    import re
    a = ''' network-object host 109.17.49.131
    object-group network KaGuan_12
    network-object host 109.17.26.11
    network-object host 109.17.26.12
    object-group network ShangHai
    network-object host 110.1.60.91
    network-object host 110.1.60.92
    network-object host 110.1.172.31
    network-object host 110.1.172.32
    network-object host 110.238.250.57
    network-object host 110.238.250.58
    object-group network wangguan_test
    network-object host 111.17.13.32
    object-group network wangguan_app_2
    network-object host 111.17.9.54
    network-object host 111.17.9.63
    '''

    re.findall(r'object-group network (\w+)(?:(?:(?!object-group).)*)(?=network-object host 110\.1\.172\.31)', a, re.DOTALL)
    ClericPy
        7
    ClericPy  
    &nsp;  Nov 14, 2019
    @TOUJOURSER #5 哦对了, 正则没法回溯取非贪婪的, 比较好的办法还是
    1. 逐行分析解析成 ip: group 映射再查询
    2. 或者是用 group 字段做 split 再查询
    ClericPy
        8
    ClericPy  
       Nov 14, 2019   1
    6 楼的零宽断言是个好方法, 先匹配非 group 再取 group
    TOUJOURSER
        9
    TOUJOURSER  
    OP
       Nov 14, 2019
    @ClericPy @todd7zhang 真的非常感谢, 这个问题困扰了我好久
    qingshengwen
        10
    qingshengwen  
       Nov 14, 2019
    试试这个看看
    object\-group\snetwork\s(.*?)(?:\s*network\-object\shost\s\d+\.\d+\.\d+\.\d+\s*){0,}(?:\s*network\-object\shost\s110.1.172.32\s*)
    https://imgur.com/a/loDyJo7
    no1xsyzy
        11
    no1xsyzy  
       Nov 14, 2019
    写个 FSM 不行吗?这还正则?(不超过十分钟写完)
    https://gist.github.com/no1xsyzy/11ba23cd13f90b3f94227d4838fd7e5a
    corningsun
        12
    corningsun  
       Nov 15, 2019
    用不上正则

    如果只需要一次匹配,只是两次截取字符串的问题,代码示例如下:

    https://gist.github.com/corningsun/87aac1ca2bc46e698a4d332a93118bbe

    如果需要多次匹配,且数据量不大的话,最好的还是解析所有 IP,做哈希表查找比较好。
    About     Help     Advertise     Blog     API     FAQ     Solana     3265 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 48ms UTC 14:13 PVG 22:13 LAX 07:13 JFK 10:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86