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 运算符的主要内容,如果未能解决你的问题,请参考以下文章