我正在使用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', '', '', '']
请解释一下这种行为。
答案 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*
将匹配c
或cc
或ccc...
:)
而.
表示匹配任何一个字符。 .*
表示匹配任意字符序列。
也许您应该考虑阅读正则表达式的介绍!
答案 5 :(得分:0)
*
是一个运算符,表示左对齐的0或更多。
.
是一个匹配任何内容的运算符。
c*
表示匹配0或更多c
.*c
将匹配0或更多任何内容,然后是c。