【问题标题】:What does [^ab]* match with a? [duplicate][^ab]* 与 a 匹配什么? [复制]
【发布时间】:2017-10-26 21:56:42
【问题描述】:

我刚刚了解到 [^ab] 将捕获除 a 或 b 之外的任何字符。 所以 [^ab]* 应该匹配 0 个或多个字符,其中没有一个是 a 或 b。

然而,python 以某种方式将 [^ab]* 匹配到 a。

pattern = '[^ab]*'
str = 'a'
r = re.compile(pattern)
m = r.match(str)
if m is None:
    print 'No match'
else:
    print 'match'

此代码 sn-p 打印匹配项。我相信要么我理解错误 ^ 的用法,要么在代码中犯了一些错误

【问题讨论】:

  • 匹配0个字符,都不是a或b。
  • 困扰你的是*,而不是^
  • 您可能会想到fullmatch 的语义而不是match
  • @user3828311:它匹配a。它与您的字符串的空前导子字符串匹配。
  • OP,也许您的意思是使用[^ab][^ab]*^[^ab]*$(毫无疑问还有其他可能性)。对于某些正则表达式实现,您可以说 [^ab]+ 表示 1 或更多;我不记得 Python 正则表达式是否能识别这一点。

标签: python regex


【解决方案1】:

[]* 表示 个或更多括号中的实例。在这种情况下,空字符串是匹配的,因为它是您的字符串的一部分。

参见the doc匹配部分。

如果字符串的个或多个开头字符匹配正则表达式模式...

如果您愿意,字符串'a' 的开头有一个空字符串''。您可以说 reg ex 将其视为''+'a',其中开头与您的模式匹配。

也许你想试试全匹配。

【讨论】:

  • 好的,我了解 [^ab]* 与 str 中的空字符串匹配的内容。与 str 中的“a”匹配的内容
  • 好吧,我想我误解了匹配和完全匹配的区别。所以 match 将匹配 str 的任何部分,完全匹配确保整个 str 匹配模式正确?
  • 不,match 将匹配字符串的 start,请参阅答案中文档的引用。
【解决方案2】:

"a" 不是要匹配的,而是要匹配的空字符串 ("")。

如您所知,正则表达式中的 * 表示前一个组匹配 0 次或多次 - 您的正则表达式匹配 [^ab] 0 次,这是一个空字符串。因此,m 不是None,而是包含空字符串,这与不匹配不同。

我将作业写入 REPL:

>>> import re
>>> pattern = '[^ab]*'
>>> str = 'a'
>>> r = re.compile(pattern)
>>> m = r.match(str)
>>> m.groups()
=> ()
>>> m.group(0)
=> ''
>>> m.group(1)
Traceback (most recent call last):
  File "python", line 1, in <module>
IndexError: no such group

您可以看到m.groups() 是一个空元组(因此不是None),而m.group(0) 返回一个空字符串,这意味着pattern 匹配1 项(因为m.group(1) 不起作用) ,这是一个空字符串。

尝试使用 [^ab]+ 不匹配任何内容 - + 类似于 *,但至少匹配一次。

【讨论】:

    【解决方案3】:

    正如前面的答案所述,使用 * 正则表达式匹配 0 或更多匹配。 这是棘手的部分。

    你可以做一些测试,更好地理解 Python 是如何处理 * 的。 match 对象 具有 groups() 方法,该方法返回组中的匹配项:

    >>> r.match(str_).groups()
    ()
    

    这看起来很奇怪。这怎么会返回一个空组?这更奇怪:findall 方法返回匹配项的列表

    >>> r.findall(str_)
    ['', '']
    

    两个空字符串。这意味着即使没有匹配项,您也会得到一个空项目(列表/元组)。如果您将* 更改为+(匹配一个或多个),结果会有所不同:

    >>> pattern = '[^ab]+'
    >>> re.match(pattern, 'a').groups()
    
    Traceback (most recent call last):
      File "<pyshell#135>", line 1, in <module>
        re.match(pattern, 'a').groups()
    AttributeError: 'NoneType' object has no attribute 'groups'
    

    这将返回None

    因此,总而言之,当在[]* 等模式中使用时,Python 会在搜索字符串的开头附加 空字符串 处理 *。但是,当使用 []+ 模式时,它不会这样做。

    【讨论】:

      猜你喜欢
      • 2019-02-13
      • 2016-12-23
      • 1970-01-01
      • 2017-09-27
      • 2012-09-17
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多