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

Python , 我有一个正则表达式的列表 和 一个字符串, 我想知道这个字符串满足列表中的哪一个正则表达式, 除了遍历一遍, 有没有更快的方法?

  •  
  •   woshichuanqilz · 2017-12-12 22:21:37 +08:00 · 2620 次点击
    这是一个创建于 2572 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如

    regex_list = ['a.*', 'b.*'.....]
    string = 'test'
    
    for i in regex_list:
    	if re.match
    		.....
    

    我的代码是这样的, 但是感觉遍历有点慢, 有没有更快的方法去做?

    13 条回复    2017-12-18 11:21:28 +08:00
    Kilerd
        1
    Kilerd  
       2017-12-12 22:24:26 +08:00
    除非你的 regex_list 有某种规律,不然只能是 O(n) 的算法了吧
    TJT
        2
    TJT  
       2017-12-12 22:39:19 +08:00


    仅供参考
    TJT
        3
    TJT  
       2017-12-12 22:40:56 +08:00
    第三行的 merge_reg 应该是 reg_merged,测试的变量
    clino
        5
    clino  
       2017-12-12 22:47:05 +08:00
    想法是将一个 re 列表合成一个大的 re,然后匹配的时候能够取到 re 列表的 index
    xml123
        6
    xml123  
       2017-12-12 23:00:18 +08:00
    我觉得把正则表达式合并了测试并不会比拆开测省时间。
    lrxiao
        7
    lrxiao  
       2017-12-13 01:21:11 +08:00
    Dganzh
        8
    Dganzh  
       2017-12-13 09:25:05 +08:00
    没有
    lieh222
        9
    lieh222  
       2017-12-13 09:29:45 +08:00
    试试周易??
    topbandit
        10
    topbandit  
       2017-12-13 09:33:49 +08:00
    试试半分法
    linuxchild
        11
    linuxchild  
       2017-12-13 10:37:25 +08:00
    @topbandit 正则表达式没有规律不能这么分吧?
    xpresslink
        12
    xpresslink  
       2017-12-13 11:37:28 +08:00
    楼主的问题本身存在着逻辑矛盾。
    你要确定这个字符串满足列表中的哪一个正则表达式,这是个限定性问题。必须完全遍历列表才能确定具体是哪一个或哪几个。如果说定义成一个函数来说,输入参数是一个字符串和一个正则列表,输出是列表中符合的元素内容或其索引位置号。

    这个和列表有没有符合的元素是不同的。
    这种情况就简单了,输出只有表示 是 /否 或 True/False 就可以了。
    如果是遍历的方法,只要碰到第一个满足条件的元素,就可以 return True 了.
    那种把表达式合并的方法只能满足这种要求。

    所以楼主你自己先要把自己的需求想清楚了.
    lniwn
        13
    lniwn  
       2017-12-18 11:21:28 +08:00 via iPhone
    可以先对 re 列表进行分类,比如,以字母开头的,以数字开头的,以符号结尾的,包含 xx 符号的。分完类之后,再分析目标字符串,看属于哪一类,最坏的情况也只是遍历某一类 re 中的所有项
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2724 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:56 · PVG 13:56 · LAX 21:56 · JFK 00:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.