免责声明-这不是家庭作业问题。通常我不会问这么简单的问题,但是我找不到一个优雅的解决方案。
我想达到的目标-
从OCR输入:"01 loren ipsum 123 dolor sit 456 amet -7891-日期13 06 2022">
解析输出:"01 loren ipsum 123 dolor sit 456 amet -7891-日期13 06 2022">
去掉数字之间的空格。然而,有一些注意事项,比如前面的数字是单个字符长(为了避免日期之类的东西)。对于"1970年1月1日"这样的日期不过如果转换成"11 1970"因为它不违反单字符原则。
我能想到的最合适的正则表达式是(.*?D)d( d)+
。然而,这对字符串开头的数字不起作用。此外,搜索和替换是相当复杂的这个正则表达式(我不能做一个re.subn
与此)。
谁能想到一个优雅的基于Python的解决方案(最好使用regex)来实现这一点?
也许你可以像格式或数字一样捕获和跳过日期,并在数字之间匹配1+空白字符以删除。
在替换中使用捕获组
b(d{1,2}s+d{1,2}s+d{4})b|(d+)s+(?!D|d{1,2}s+d{1,2}s+d{4}b)
模式匹配:
b
防止部分字匹配的字边界(d{1,2}s+d{1,2}s+d{4})b
在组1中捕获一个类似日期的模式|
或(d+)
Capture组2,匹配1+数字s+
匹配1+空格字符(将被删除)(?!
负向前看,断言当前位置的直接右侧不是D
匹配非数字|
或d{1,2}s+d{1,2}s+d{4}b
匹配日期模式
)
关闭正向正向
Regex演示
import re
pattern = r"(bd{1,2}s+d{1,2}s+d{4})b|(d+)s+(?!D|d{1,2}s+d{1,2}s+d{4}b)"
s = "0 1 loren ipsum 1 2 3 dolor sit 4 5 6 amet -7 8 9 1- date 13 06 2022"
result = re.sub(pattern, r"12", s)
if result:
print (result)
输出01 loren ipsum 123 dolor sit 456 amet -7891- date 13 06 2022
>>> import re
>>> regex = re.compile(r"(?<=bd)s+(?=db)")
>>> regex.sub("", "0 1 loren ipsum 1 2 3 dolor sit 4 5 6 amet -7 8 9 1- date 13 06 2022")
'01 loren ipsum 123 dolor sit 456 amet -7891- date 13 06 2022'
解释:
(?<=bd) # Assert that a single digit precedes the current position
s+ # Match one (or more) whitespace character(s)
(?=db) # Assert that a single digit follows the current position
sub()
操作删除所有匹配此规则的空格。