-3

我正在使用 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', '', '', '']

请解释这种行为。

4

6 回答 6

2

文档

'*'

使生成的 RE 匹配前一个 RE 的 0 个或多个重复,尽可能多的重复。ab* 将匹配 'a'、'ab' 或 'a' 后跟任意数量的 'b'。

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

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

c*意味着找到'c'彼此相邻的所有 s(0 到任意次数)并将它们分组,所以当它到达'e'no时,'c'它会返回 en 空字符串。

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

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

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

'c.*':这与最后一个完全相反,将所有出现在第一个'c'之后的字符分组。

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

>>> strs = "qwertyu"
>>> re.findall(exp,strs) #no 'c' found
[]
于 2013-06-19T07:17:09.000 回答
1

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

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

解释你的模式

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

*c:匹配包含...的最长可能序列……哎呀,您没有指定序列中允许的内容,抛出错误。

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

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


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

于 2013-06-19T07:25:12.763 回答
1

文档很清楚,'*' 重复前 0 次或更多次。似乎您想忽略正则表达式文档并将其含义转换为您从其他域中知道的内容,例如 DOS 通配符或 shell 扩展。

于 2013-06-19T07:19:39.257 回答
0

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

当你这样做时c*,这意味着“匹配任意数量的连续'c'”

我建议您阅读有关正则表达式的内容。

于 2013-06-19T07:16:37.910 回答
0

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

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

于 2013-06-19T07:17:58.753 回答
0

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

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

c*将意味着匹配 0 个或多个 c

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

于 2013-06-19T07:18:27.867 回答