我正在尝试从内容中获取下面的字符串,这是从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')
$[]
但如果文本根本不存在则不应该抛出错误
答案 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
答案 1 :(得分:1)
我创建了两个注册模式
我们从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)