严格的正则表达式python

时间:2018-03-15 04:43:13

标签: regex python-3.x

我正在尝试从内容中获取下面的字符串,这是从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 个答案:

答案 0 :(得分:2)

您的正则表达式\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

答案 1 :(得分:1)

我创建了两个注册模式

  1. 为了匹配我们想要的确切结果
  2. 用于匹配可能有或没有特殊字符的结果
  3. 我们从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)