Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何获取正则表达式的最近匹配_Python_Regex - Fatal编程技术网

Python 如何获取正则表达式的最近匹配

Python 如何获取正则表达式的最近匹配,python,regex,Python,Regex,我有一个使用正则表达式从文本(格式=mm dd yyyy)中提取日期的代码 注意:使用OCR在票据图像上获取文本。因此,预期的日期格式是mm dd yyyy,但它可以是使用OCR获得的任意随机文本 import re date_reg_exp = re.compile('\d{2}[-/.]\d{2}[-/.]\d{4}') #works for mm-dd-yyyy matches_list=date_reg_exp.findall(test_str) for match in matches

我有一个使用正则表达式从文本(格式=mm dd yyyy)中提取日期的代码

注意:使用OCR在票据图像上获取文本。因此,预期的日期格式是mm dd yyyy,但它可以是使用OCR获得的任意随机文本

import re
date_reg_exp = re.compile('\d{2}[-/.]\d{2}[-/.]\d{4}') #works for mm-dd-yyyy
matches_list=date_reg_exp.findall(test_str)
for match in matches_list2:
  print match
如果我有一个字符串
“这是从OCR 09-11-2015中提取的文本”
,则上面的代码工作并将日期作为输出
“09-11-2015”
。但是,如果我有一个字符串
“这是o text extractud fram OCR 09-11-201 5”
“这是o text extractud fram OCR 09-11-201”
“这是o text extractud fram OCR O9-11-201”
则失败。如何为这样的场景编写代码,在这种场景中,它也会选择最接近的匹配项。

试试看-

O?\d{1,2}[-/\.]\d{2}[-/\.][\d\s]{2,}
如下-

>>>import re
>>>s = """If I have a string 'This is a text extracted from OCR 09-11-2015' the above code works and results the Date as output '09-11-2015'. But, if I have a string 'This is o text extractud fram OCR 09-11-201 5' or 'This is o text xtractud fram OCR 09-11-201' or 'This is o text xtractud fram OCR O9-11-201' it fails. How to I write a code for such scenario where it also picks up the nearest match."""
>>>re.findall(r'O?\d{1,2}[-/\.]\d{2}[-/\.][\d\s]{2,}',s)
>>>['09-11-2015', '09-11-2015', '09-11-201 5', '09-11-201', 'O9-11-201']
然后尝试将所有
O
替换为
0

>>>[i.replace('O','0') for i in ['09-11-2015', '09-11-2015', '09-11-201 5', '09-11-201', 'O9-11-201']]
>>>['09-11-2015', '09-11-2015', '09-11-201 5', '09-11-201', '09-11-201']
现场观看

或者-如果日期中有日期分隔符,例如
/
-
,则下面应该提取日期-它考虑所有字符。像
$
对于
5

\b[\w\$\s]{2}\s*[\.-/-]\s*[\w\$]{2,}\s*[\.-/-]\s*[\w\$]{2,}
现场观看

注意:由于你的数据是一场灾难,你绝对不会得到100%的准确结果,相反,使用好的ocr引擎可以提高准确度


编辑


如果您想实现某种模糊匹配,请使用模块。

这不是标题所要求的 但是,正如您提到的Levenshtein距离,它可能对您的场景非常有用

from dateutil.parser import parse

s = 'This is o text xtractud fram OCR O9-11-201'

parse(s, fuzzy=True)

datetime.datetime(201, 9, 11, 0, 0)
Dateutil提供了一个模糊的datetime解析器


这适用于
'09-11-201'
,但不适用于
'09-11-201 5'

有几种方法可以实现与正则表达式的近似匹配。最“理论上简单”的方法可能需要在regexp上执行类似的计算

这是一个相当棘手的编码算法,没有太多的实现。最著名的是(从技术上讲,
agrep
工具实现了几种算法,但最著名的是模糊regexp匹配)


通过这个关键字进行简单的谷歌搜索,它似乎有Python绑定,可能正是您所需要的。

这取决于“最近”的定义。您的示例可以通过在匹配之前删除空格来处理程序。好的。让我更具体一点。如果我有一个字符串
“字符串是09-11-201”
,它与正则表达式最接近。这应该作为输出打印。输出-
09-11-201
你的月和日的格式是否正确,只是年份被弄乱了?在问题中增加了一些细节。请再检查一次。这可以用额外的空间工作。但是,如果某个数字丢失,如
'09-11-201
,则会失败。我需要一个通用的
regex
或某种有助于识别此类场景的算法。您能否发布所有可能的日期格式,而我可以使regex通用化。目前我只有一种日期格式
mm dd yyyy
。我实际上在做OCR(从账单中提取日期)。所以我需要这个场景。听说过Levenshtein,但我不知道它在本例中的实现,因为
Date
不是一个英语单词。感谢mate的努力。但是,对于
'09-11-201S'
,它再次失败。我们不能一直为每个场景编写
regex
,对吗?我想我需要了解@KT提到的方法。编辑后的答案请参见关于
Levenshtein距离的建议
它是否适用于
'O9-11-2015'
'09-11-201S'
?因为OCR引擎可能会混淆
0
O
以及
5
S
。在上面的示例中,我错误地使用了
O
而不是
0
。它在这里起作用是因为字母表不在日期之间,只是被省略了。所以,它对字母表不起作用。如果您无法找到应该查找的任何日期,您可以在替换所有S和O后编写更多代码来提取日期。如果您熟悉该库,请提供一个示例帮助我理解。已经给出的示例有什么问题?