Python 正则表达式匹配 OR 运算符

Posted

技术标签:

【中文标题】Python 正则表达式匹配 OR 运算符【英文标题】:Python regex match OR operator 【发布时间】:2013-11-18 05:53:12 【问题描述】:

我正在尝试匹配上午或下午的时间格式。

i.e. 02:40PM
     12:29AM 

我正在使用以下正则表达式

timePattern = re.compile('\d2:\d2(AM|PM)')

但它只返回 AM PM 没有数字的字符串。怎么了?

【问题讨论】:

也许使用捕获组 @Tommy:他正在使用捕获组;这就是造成问题的原因。当正则表达式具有捕获组时,findall() 仅返回那些,而不是完整匹配。 请注意,您也可以完全避开该组,将(AM|PM) 更改为[AP]M 【参考方案1】:

使用非捕获组(?: 并引用匹配组。

使用re.I 进行不区分大小写的匹配。

import re

def find_t(text):
    return re.search(r'\d2:\d2(?:am|pm)', text, re.I).group()

您也可以使用re.findall() 进行递归匹配。

def find_t(text):
    return re.findall(r'\d2:\d2(?:am|pm)', text, re.I)

demo

【讨论】:

【参考方案2】:

使用非定界捕获组(?:...)

>>> from re import findall
>>> mystr = """
... 02:40PM
... 12:29AM
... """
>>> findall("\d2:\d2(?:AM|PM)", mystr)
['02:40PM', '12:29AM']
>>>

此外,您可以将正则表达式缩短为 \d\d:\d\d(?:A|P)M

【讨论】:

【参考方案3】:

当您需要访问组 0 时,听起来您正在访问组 1。

您的正则表达式中的组如下:

\d2:\d2(AM|PM)
           |-----|  - group 1
|----------------|  - group 0 (always the match of the entire pattern)

您可以通过以下方式访问整场比赛:

timePattern.match('02:40PM').group(0)

【讨论】:

【参考方案4】:

您没有捕获小时、分钟字段:

>>> import re
>>> r = re.compile('(\d2:\d2(?:AM|PM))')
>>> r.search('02:40PM').group()
'02:40PM'
>>> r.search('Time is 12:29AM').group()
'12:29AM'

【讨论】:

【参考方案5】:

您是否不小心抓住了第一个集群(其中的内容与括号中的模式部分匹配)而不是“第 0 个”集群(即整个匹配项)?

【讨论】:

以上是关于Python 正则表达式匹配 OR 运算符的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式高级替换,匹配后进行运算,然后使用结果替换,怎么实现?

MySQL中的Like和正则表达

PyMongo 匹配 JavaScript 正则表达式对象

100天精通Python—第34天:正则表达式大总结

正则表达式匹配字符周围的字符,正则表达式中的AND运算符?

正则表达式如何匹配空值?