在regexp

时间:2017-09-22 06:41:46

标签: python regex regex-greedy

我们都知道*表示0或更多,除非与非贪婪的运算符?一起使用,否则它将始终是贪婪的。

>>> re.search('.*hello','hai hello there, hello again').group()
'hai hello there, hello'
>>> re.search('.*?hello','hai hello there, hello again').group()
'hai hello'

我刚刚看到以下代码,并且看到这种行为并不奇怪。

>>> re.search('\^*','abc^').group()
''
>>> re.search('a*','abc^').group()
'a'

使用模式\^*,我希望它匹配字符串中出现的一个插入符号。

但是,为什么它必须通过退出0出现的插入符号,空字符串匹配来表现非贪婪?

是因为^对正则表达式有特殊意义吗?如果是,那么我们如何将^*符号相匹配?

注意:当然,以\^+作为模式,它显然会匹配文字插入符号。

2 个答案:

答案 0 :(得分:1)

正则表达式引擎从左到右解析输入字符串,因此,\^*在开始时匹配空字符串,而re.search仅返回第一次出现的字符串。

当您搜索某些内容时,应避免使用可能与空字符串匹配的模式,\^*是匹配0个或更多^个符号的模式。因此,最佳解决方案是使用+代替*

答案 1 :(得分:0)

@WiktorStribiżew解释说re.search只返回第一场比赛。 所以:

  1. re.search('\ ^ *','abc ^')。group()返回空字符串;即它匹配字符串开头的插入符号的0倍并返回。
  2. re.search('a *','abc ^')。group()在字符串的开头匹配1 a并返回此a
  3. re.search('b *','abc ^')。group()匹配空字符串的原因与插入符号相同(案例1)
  4. 回答你的问题“我们如何将^与*符号相匹配?”
    您可以使用组(\^+)*并获取该组的结果:

    re.search('(\^+)*','abc^^ab').group()