我理解
* = "zero or more"
? = "zero or more" ...what's the difference?
另外,?:<<我的书使用了它,它说它是一个“微妙”,但我不知道它们到底是做什么的!
答案 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)
?
并不意味着“零或更多”,它意味着“零或一”。