【问题标题】:Regex doesn't rules out cases python正则表达式不排除案例 python
【发布时间】:2019-02-28 23:37:04
【问题描述】:

我正在尝试开发一个正则表达式,它将采用以下格式:

date: 1:10 #7 (correct)
date: 1:10 (correct)
1:10 #7 (correct)
13.01.06 (incorrect)

这是我在 pythex 上开发的正则表达式:

(date)? ?\D? ?(1|4) ?(:|-|\.) ?[-+]?[0-9]+( ?(#) ?[a-zA-Z0-9]?)?

我在使用 OCR 的 Python 项目中工作,因此有时 1 到 10 之间的“:”翻译不正确。你们有更好的方法来解决正则表达式问题吗?

【问题讨论】:

  • 这行得通吗(日期)? ?\D:? ?(1|4) ?(:|-|.) ?[-+]?[0-9]+( ?(#) ?[a-zA-Z0-9]?)?
  • 是的,这行得通!!!你是怎么想出来的?
  • 您可以在正则表达式中放置固定的字符以匹配。我觉得你需要:在你所有的字符串中,所以它应该是表达式中的强制字符。当您在 D 之后放置 : 表示在数字之后必须匹配 :,如果不是,则正则表达式匹配将失败。这就是第一个字符串不匹配的原因。

标签: regex python-3.x ocr


【解决方案1】:

您是否特别需要正则表达式?如果没有,您可以通过将字符串解析为datetime 来解决您的问题。

from datetime import datetime
def test_date(date_string):
    try:
        datetime.strptime(date_string, '%d.%m.%y')
        return # or do something else to skip the further processing
    except ValueError:
        pass
    # Process valid date string
    print('Valid date: {}'.format(date_string))

test_date('13.01.06') # Does not print anything
test_date('1:10 #7')  # Works!

【讨论】:

  • 是的,正如我所提到的,我正在使用 OCR 将 pdf 翻译成 txt,这是一个示例。
【解决方案2】:

您需要通过在\D 之后删除? 来强制使用非数字模式,并使用可选的非捕获组将整个部分包裹在(1|4) 模式之前(以匹配date:和空格可选),最后在(1|4) 模式之前添加一个单词边界,以便当数字前面没有数字、字母或_ 时,它只能作为整个单词匹配。

(?:(date)? ?\D ?)?\b([14]) ?([-:.]) ?[-+]?([0-9]+)( ?# ?([a-zA-Z0-9]*))?
^^^           ^  ^^^

请参阅regex demo

【讨论】:

    猜你喜欢
    • 2012-02-17
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2013-10-04
    • 1970-01-01
    相关资源
    最近更新 更多