Python正则表达式或(OR)

72

假设我希望有一个正则表达式可以匹配 "Sent from my iPhone" 和 "Sent from my iPod",该怎么写呢?

我尝试了以下的表达式:

re.compile("Sent from my [iPhone]|[iPod]") 

但似乎不起作用。


2
看起来你需要重新学习一下基础知识,这会对你大有裨益。可以参考以下链接:Python 正则表达式 HOWTO 或者 regular-expressions.info - ridgerunner
你可以使用 https://pythex.org 快速、轻松地尝试 Python 正则表达式。每当我在寻找正确的语法时,我发现这非常有帮助。 - J Jones
2个回答

103
re.compile("Sent from my (iPhone|iPod)")

这里查看实例。


29
甚至可以写成“来自我的iP(:?hone|[ao]d)”,这也包括iPad。 - Chris Tonkinson
7
“输出什么?你真的认为这值得投反对票吗?它对于提出问题的人和其他找到它的人都有效,但对于你使用的与原始问题无关的特定方式却无效?” - Paul
5
我的答案只匹配Sent from my iPhoneSent from my iPod,而不是单独的字符串iPhoneiPod。虽然我的答案和re.compile("(iPhone|iPod)")都可以在字符串Red iPhone中找到匹配项,但我的答案要求字符串在iPhoneiPod之前必须有Sent from my。请注意,"匹配"和"捕获"是有区别的,而问题仅问及"匹配"。另外,正则表达式并不输出任何内容,所以我不确定你的意思。 - Paul
1
另一个答案只是抑制了捕获组,因此虽然我们两个的答案都给出了 match.group(0) == 'Sent from my iPhone',但我的答案还允许你使用 match.group(1) == 'iPhone' 单独获取已捕获部分 (如果你想要的话),而另一个答案中的 match.group(1) 将引发 IndexError: no such group - Paul
2
@ChrisTonkinson 在你(有用的!)评论中,应该是 ?: 而不是 :? - Bálint Sass
显示剩余2条评论

35
re.compile("Sent from my (?:iPhone|iPod)")
如果你需要捕获匹配结果,去掉?:。顺便说一下,你的正则表达式无法工作是因为你正在测试 i、P、h、o、n 或 e 中的一个字符或 i、P、o、d 中的一个字符。

3
不,他们正在测试“Sent from my”以及字符i、P、h、o、n或e中的一个;或者字符i、P、o或d中的一个。竖线表示OR,最高层级,左边包含“Sent from my”,右边则不包含。 - PaulMcG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接