正则表达式中*和。*之间的差异(使用python)

时间:2013-06-19 07:12:32

标签: python regex

我正在使用Python 2.7。

我想知道匹配单词时*.*之间的区别。

以下是python中的代码

exp = r'.*c' #here is the expression
line = '''abc dfdfdc dfdfeoriec''' #the words I need to match 
re.findall(exp,line) #python expression

以上代码的输出是:

['abc dfdfdc dfdfeoriec']

如果我将exp值更改为:

exp = r'*c'

...然后在执行时我收到以下错误:

Traceback (most recent call last):   File "<stdin>", line 1, in
<module>   File "C:\Program
Files\Enthought\Canopy32\App\appdata\canopy-1.0.0.1160.win-x86\lib\re.py",
line 177, in findall
    return _compile(pattern, flags).findall(string)   File "C:\Program Files\Enthought\Canopy32\App\appdata\canopy-1.0.0.1160.win-x86\lib\re.py",
line 242, in _compile
    raise error, v # invalid expression error: nothing to repeat

这是另一个代码

exp = r'c.*'
line1='''cdlfjd ceee cll'''
re.findall(exp,line1)

上面代码的输出是

['cdlfjd ceee cll']

如果我将exp值更改为:

exp = r'c*'

然后在执行时我得到以下输出。

['c', '', '', '', '', '', '', 'c', '', '', '', '', 'c', '', '', '']

请解释一下这种行为。

6 个答案:

答案 0 :(得分:2)

来自docs

'*'
  

使得到的RE匹配0或更多次重复   在RE之前,尽可能多的重复。 ab *将匹配'a',   'ab'或'a'后跟任意数量的'b'。

IN r'*c"你没有重复前面的字符,所以这是一个错误。

>>> import re
>>> strs = "ccceeeddc"
>>> re.findall(r'c*',strs)
['ccc', '', '', '', '', '', 'c', '']
         |   |   |   |   |        |
         e   e   e   d   d        nothing found after last `c`

c*表示找到彼此相邻的所有'c'(0到任意时间)并对它们进行分组,所以当它到达'e'时没有{{1}找到它所以返回空字符串。

'c':将所有内容分组到找到的最后'.*c'

c

>>> strs = "abccccfoocbar" >>> exp = r'.*c' >>> re.findall(exp,strs) ['abccccfooc'] >>> strs = "qwertyu" >>> re.findall(exp,strs) #no 'c' found [] :这与最后一个完全相反,将所有在第一个'c'之后为fuund的字符分组。

'c.*'

答案 1 :(得分:1)

文档很清楚,'*'重复前一次0次或更多次。好像你想忽略reqular表达式文档,并将它的含义翻译成你从其他域知道的内容,例如DOS通配符或shell扩展。

答案 2 :(得分:1)

在regural表达式中,'x *'匹配0或更多'x'的序列(其中x可以是任何东西)。默认情况下,'*'是贪婪的,这意味着它会尝试匹配尽可能多的字符 还有,'。'正则表达式中的字符匹配任何字符。

因此,.*表示:匹配包含任何字符的长度为0或更长的序列。

您的模式说明

.*c:匹配包含任何字符的最长序列,后跟字符“c”。

*c:匹配包含... oops的最长序列,但未指定序列中允许的内容,抛出ERROR。

c.*:匹配字符“c”,后跟包含任何字符的最长序列。

c*:匹配包含字符'c'的最长序列。请注意,最长可能也意味着“长度为0”(这就是为什么你得到那些空字符串)。


您可能希望找到此链接有助于进一步阅读正则表达式:

答案 3 :(得分:0)

这不是一个python的东西,而是一般的正则表达式的东西。 *表示匹配任意数量的前一个,当.表示“所有内容”时,*.c表示匹配以char'c'结尾的任意数量的字符。当你执行*c时,它是非法的,因为在*之前没有表达。

执行c*时,表示“匹配任意数量的连续'c'”

我建议你做一些关于正则表达式的阅读。

答案 4 :(得分:0)

*只是意味着它前面的字符可以匹配0到很多次。因此*c不起作用。但c*将匹配cccccc... :) 而.表示匹配任何一个字符。 .*表示匹配任意字符序列。

也许您应该考虑阅读正则表达式的介绍!

答案 5 :(得分:0)

*是一个运算符,表示左对齐的0或更多。

.是一个匹配任何内容的运算符。

c*表示匹配0或更多c

.*c将匹配0或更多任何内容,然后是c。