很好的正则表达式,用于清理Python中空格分隔的数字



免责声明-这不是家庭作业问题。通常我不会问这么简单的问题,但是我找不到一个优雅的解决方案。

我想达到的目标-

从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()操作删除所有匹配此规则的空格。

相关内容

  • 没有找到相关文章

最新更新