2013-06-19 61 views
-2

我正在使用Python 2.7。正则表达式中的*和。*之间的区别(使用python)

我想知道*.*之间的区别,而匹配的话。

以下是在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

你有没有抬头的文件定期Python中的表达式? –

+0

有一些其他的RE问题,这是一个骗局... –

回答

0

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

当你做c*它的意思是“匹配任何数量的连续‘C’的”

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

2

docs

'*' 

Causes the resulting RE to match 0 or more repetitions of the preceding RE, as many repetitions as are possible. ab* will match ‘a’, ‘ab’, or ‘a’ followed by any number of ‘b’s.

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'没有'c'是发现了它返回带空字符串。

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

>>> strs = "abccccfoocbar" 
>>> exp = r'.*c' 
>>> re.findall(exp,strs) 
['abccccfooc'] 

>>> strs = "qwertyu" 
>>> re.findall(exp,strs) #no 'c' found 
[] 

'c.*':这是最后一个,组被后第一“c”的fuund所有字符的正好相反。

>>> exp = r'c.*' 
>>> strs = "abccccfoocbar" 
>>> re.findall(exp,strs) 
['ccccfoocbar'] 

>>> strs = "qwertyu" 
>>> re.findall(exp,strs) #no 'c' found 
[] 
+0

感谢您的明确解释。 –

+0

@BhairavGooli很高兴帮助,如果它适合你,你可以[接受答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235) 。 –

0

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

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

0

*是一个运算符,表示0或更多的左边匹配。

.是一个运算符意思是匹配任何东西。

c*意味着匹配0或多个C的

.*c将匹配0或更多的东西,然后是C。

1

文档非常清晰,'*'重复前面的0次或更多次。好像你想忽略指令表达式文档,并且将它翻译成你知道的来自其他某个域的内容,比如DOS通配符或shell扩展。

1

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

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

的你的模式

.*c说明:匹配包含任何字符和后跟字符“C”尽可能长的序列。

*c:匹配包含...的最长可能序列...您没有指定在序列中允许的内容,引发错误。

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

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


您可能希望找到这对正则表达式的进一步阅读链接有用:

相关问题