OR运算符(|)如何在正则表达式中工作?

2024-10-02 08:22:28 发布

您现在位置:Python中文网/ 问答频道 /正文

希望在正则表达式匹配中使用or运算符(|),但它不起作用。获取错误消息为“不支持的操作数”。有人能看一下吗?你知道吗

甚至尝试了|和“或”,但都不起作用。你知道吗

import re

date = "02.29.2001"
date29 = "((02)\.(0[1-9]|[12][0-9]))"
date28 = "((02)\.(0[1-9]|[12][0-8]))"
res = re.search((date28 | date29)+("\.(\d+)"),date)

在这里,如果我只使用date29,那么它匹配,但当我把它改为如上所述,它不匹配。你知道吗


Tags: orimportre消息searchdate错误运算符
1条回答
网友
1楼 · 发布于 2024-10-02 08:22:28

您将Python语法(or布尔运算符和|位OR运算符)与regex语法混合使用。你知道吗

虽然正则表达式确实使用|来分隔备用模式,但正则表达式中使用的语法是不同的,并且与Python操作符分隔开来。你不能任意地把两者结合起来。正则表达式语法通过字符串传递给re模块函数,而不是作为Python表达式。你知道吗

这样做有效:

either = r"({}|{})\.(\d+)".format(date28, date29)
res = re.search(either, date)

因为正则表达式模式是使用正则表达式语法first组合成单个字符串的。你知道吗

请注意,这里使用date28没有任何意义,因为date28可以匹配的所有内容也可以由date29匹配。此外,date2802.19.不匹配,有效日期为2月份。你知道吗

如果您想从“标签”组件构造正则表达式,我建议您使用re.VERBOSE标志,这会导致忽略正则表达式中的空格(包括换行符),并增加对使用# ...注释的支持。要匹配空白,请使用显式类,如[ ][\n]\s等。我也经常将其与显式组名结合使用。你知道吗

你的表达可以写成:

february_date = re.compile(
    r"""
    (
        02\.     # month, always February
        (        # Leap year
            0[1-9]      # first 9 days
            |
            [12][0-9]   # remainder from 10 to 29
        )
        |
        02\.
        (        # regular year
            0[1-9]      # first 9 days
            |
            [12][0-8]   # remainder 10-18, 20-28
        )
    )
    \.(\d+)   # The year
    """, flags=re.VERBOSE)
res = february_date.search(date)

这种格式还可以更容易地看到您在任何一种模式的开头都匹配了02\.,这是相当多余的,而且上面的模式当然仍然存在着[12][0-8][12][0-9]都是多余的,实际上并不匹配2月19日的问题。你知道吗

就我个人而言,我只需要使用\d{2}\.\d{2}\.\d{4},然后使用^{}来验证匹配的文本实际上是一个有效的日期。构建一个regex来验证日期是一项艰巨的任务,根本不值得这么做。你知道吗

例如,您试图构建的模式没有告诉您2001年不是闰年,因此02.29.2001不是有效日期。但是试图用datetime.strptime()解析它会抛出一个异常,告诉您这不是一个有效的日期:

>>> from datetime import datetime
>>> date = '02.29.2001'
>>> datetime.strptime(date, "%m.%d.%Y")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/_strptime.py", line 458, in _strptime
    datetime_date(year, 1, 1).toordinal() + 1
ValueError: day is out of range for month

相关问题 更多 >

    热门问题