代码之家  ›  专栏  ›  技术社区  ›  Kurt

对python中的表达式应用多个负regex

  •  1
  • Kurt  · 技术社区  · 15 年前

    这个问题类似于 "How to concisely cascade through multiple regex statements in Python" 除了匹配一个正则表达式并做一些我需要做的事情来确保我不匹配一组正则表达式之外,如果找不到匹配项(也就是说我有有效的数据),那么做一些事情。我已经找到了一种方法,但是我认为一定有更好的方法,特别是如果我最终得到了许多正则表达式。

    基本上,我是在过滤url中的坏东西(“”、\\等),当我从HTML文档中提取一个看起来像有效的url时,会发生这种情况,但结果却是一个javascript的一部分(因此需要进行评估,因此需要对转义字符进行评估)。我不能用漂亮的汤来处理这些页面,因为它们很容易被破坏(实际上我使用漂亮的汤,然后返回到我丑陋但可操作的解析器)。

    到目前为止,我发现下面的工作相对比较好:我在主循环之外编译了一个dict或正则表达式(所以我只需要编译一次,但是每次使用它时都会从速度的提高中受益),然后我通过这个dict循环一个URL,如果有匹配,那么URL是坏的,如果不是好的,那么URL是好的:

    regex_bad_url = {"1" :   re.compile('\"\"'),
                     "2" :   re.compile('\\\"')}
    

    然后:

    url_state = "good"
    
    for key, pattern in regex_bad_url_components.items():
        match = re.search(pattern, url)
        if (match):
            url_state = "bad"
    
    if (url_state == "good"):
    # do stuff here ...
    

    现在显而易见的想法是使用regex“或”(“”),即:

    re.compile('(\"\"|\\\")')
    

    这减少了比较的数量和其他内容,但更难排除故障(每个比较有一个表达式,我可以很容易地添加如下打印语句:

    print "URL: ", url, " matched by key ", key
    

    那么,是否有什么方法可以让两个世界都达到最佳状态(即最少的比较数量),但仍然能够打印出哪个regex与URL匹配,或者我只是需要咬紧牙关,在调试时让我的代码更慢但更容易地进行故障排除,然后将所有的regex组合成一行进行生产?(这意味着编程和代码维护还有一个步骤以及可能出现的问题)。

    更新:

    戴夫·韦伯的回答很好,因此实际代码如下:

    match = re.search(r'(?P<double_quotes>\"\")|(?P<slash_quote>\\\")', fullurl)
    if (match == None):
        # do stuff here ...
    else:
        #optional for debugging
        print "url matched by", match.lastgroup
    
    1 回复  |  直到 15 年前
        1
  •  2
  •   David Webb    15 年前

    “squoosh”将所有正则表达式放在一行中,但使用 (?P<name>...) 然后使用 MatchOjbect.lastgroup 找到匹配的。