如何使用 ?和?:和:在REGEX中用于Python?

时间:2009-10-16 09:00:35

标签: python regex syntax

我理解

* = "zero or more"
? = "zero or more" ...what's the difference?

另外,?:<<我的书使用了它,它说它是一个“微妙”,但我不知道它们到底是做什么的!

4 个答案:

答案 0 :(得分:5)

正如Manu所说,?意味着“零或一次”。它与{0,1}相同。

通过?:,你可能意味着(?:X),其中X是其他字符串。这被称为“非捕获组”。 通常,当您将括号括在某个东西周围时,可以将这些括号匹配的内容进行分组。例如,正则表达式.(.).(.)匹配任意4个字符(换行符除外)并将第二个字符存储在组1中,将第四个字符存储在组2中。但是,当您执行:.(?:.).(.)时,只有第四个字符存储在第1组中,(?:.)匹配的所有内容都匹配,但不会“记住”。

一个小小的演示:

import re
m = re.search('.(.).(.)', '1234')
print m.group(1)
print m.group(2)
# output:
# 2
# 4

m = re.search('.(?:.).(.)', '1234')
print m.group(1)
# output:
# 4

您可能会问自己:“为什么要使用这个非捕获组?”。好吧,有时,你想在两个字符串之间进行OR,例如,你想匹配字符串“www.google.com”或“www.yahoo.com”,然后你可以这样做:www\.google\.com|www\.yahoo\.com,但更短的是:www\.(google|yahoo)\.com当然。但是如果你不打算对这个小组捕获的东西(字符串“google”或“yahoo”)做一些有用的事情,你也要注意使用非捕获组:www\.(?:google|yahoo)\.com。当正则表达式引擎不需要“记住”子字符串“google”或“yahoo”时,您的应用程序/脚本将运行得更快。当然,它与相对较小的字符串没有多大区别,但是当你的正则表达式和字符串变大时,它可能会变大。

有关使用非捕获组的更好示例,请参阅下面的Chris Lutz的评论。

答案 1 :(得分:4)

  

?:<<我的书使用了它,它说它是一个“微妙”,但我不知道它们到底是做什么的!

如果这确实是你的书所说的,那么我建议你买一本更好的书。

在括号内(更确切地说:在左括号后面),?具有另一种含义。它启动一组选项,它们仅计算括号的范围。 ?:是这些选项的特例。要了解这种特殊情况,您必须首先知道括号创建捕获组:

a(.)c

这是一个正则表达式,匹配以a开头并以c结尾的任何三个字母的字符串。中间人物是(或多或少)aribtrary。由于您将它放在括号中,您可以捕获它:

m = re.search('a(.)c', 'abcdef')
print m.group(1)

这将打印b,因为m.group(1)会捕获第一个括号的内容(group(0)捕获整个匹配,此处为abc)。

现在,请考虑这个正则表达式:

a(?:.)c

这里没有捕获 - 这是开括号后的?:意味着什么。也就是说,以下代码将失败:

print m.group(1)

因为没有第1组!

答案 2 :(得分:2)

? =零或一个

您使用(?:)进行分组,无需像使用()

那样将组保存在临时变量中

答案 3 :(得分:1)

?并不意味着“零或更多”,它意味着“零或一”。