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

严格正则表达式python

  •  1
  • trex  · 技术社区  · 8 年前

    我试图从内容中提取以下字符串,该内容是从pdf提取的表行的一部分。

    $import re
    $re.findall(r'\s\d+\s[Trillion$]+', '2 4334 Rigid Tall 54 Trillion somr text')
    $[' 54 Trillion']
    

    这是有效的,但如果字符串包含一些无效字符,它将返回空列表,而我希望它应该抛出一个错误。

    $re.findall(r'\s\d+\s[Trillion$]+', '2 4334 Rigid Tall 5&_4 T×rillion somr text')
    $[]
    

    但如果文本根本不存在,它不应该抛出错误

    2 回复  |  直到 8 年前
        1
  •  2
  •   anubhava    8 年前

    你的正则表达式 \s\d+\s[Trillion$]+ 有一个问题是它使用的是字符类 [...] 其中每个字符分别匹配。所以 [Trillion$]+ 也将匹配 TTTT $$$$$ 而且

    您需要删除字符类并使用 .search 而不是 .findall 如以下示例所示:

    import re
    
    input = ['2 4334 Rigid Tall 54 Txrillion somr text', '4334 Rigid Tall 54 Trillion somr text']
    
    reg = re.compile(r'\b\d+\s+Trillion\b')
    
    for s in input:
       res = reg.search(s)
       if res:
          print "Matched:", res.group(0), "::", s
       else:
          print "Didn't Match:", s
    

    输出:

    Didn't Match: 2 4334 Rigid Tall 54 Txrillion somr text
    Matched: 54 Trillion :: 4334 Rigid Tall 54 Trillion somr text
    

    Code Demo

        2
  •  1
  •   moghya    8 年前

    我创建了两个reg ex模式

    1. 用于匹配我们想要的精确结果
    2. 用于具有或不具有特殊字符的匹配结果

    我们从reg-x得到结果,并根据产生错误的结果计数。 请检查下面的代码和演示 here

    import re
    
    def process(text):
        result_a = re.findall(r'\d+\sTrillion',text)
        result_b = re.findall(r'[@#$%^&+=]*\d+[@#$%^&+=]*\d*\s[@#$%^&+=]*T[@#$%^&+=]*r[@#$%^&+=]*i[@#$%^&+=]*l[@#$%^&+=]*l[@#$%^&+=]*i[@#$%^&+=]*o[@#$%^&+=]*n[@#$%^&+=]*',text)
        if len(result_a)==0 and len(result_b)>0:
            print('raise error here beacause ',result_b)
        else:
            print(result_a)
    
    
    tests = ["2 4334 Rigid Tall 54 Trillion somr text","2 4334 Rigid Tall +54 Tri+llio@n somr text"]
    for test in tests:
        process(test)