[^ ab] *与a匹配的是什么?

时间:2017-10-26 21:56:43

标签: python regex

我刚刚知道[^ ab]会捕捉除a或b之外的任何字符。 所以[^ ab] *应匹配0个或更多字符,其中没有一个是a或b。

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

相匹配
2  2  3
4  2  5
1  5  2

此代码段打印匹配项。我相信我在理解^的使用方面错了,或者在代码中犯了一些错误

3 个答案:

答案 0 :(得分:2)

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

请参阅the doc匹配部分。

  

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

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

也许你想尝试使用fullmatch。

答案 1 :(得分:1)

namespace Algorytm8 { class Program { private int[] P; private int count, n; public int silnia(int n) { return (n == 1 || n == 0) ? 1: silnia(n-1) * n; } public void swap(int i, int j) { int pom; pom = P[i]; P[i] = P[j]; P[j] = pom; } public int b(int m, int i) { if ((m % 2 == 0) && (m > 2)) { if (i < m - 1) { return i; } else { return m - 2; } } else { return m - 1; } } public void perm(int m) { int Mi; int[] I = P; for (int i = 1; i <= m; i++) { I[i] = 1; } Mi = 1; while (count < silnia(m)) { if (I[Mi]==Mi) { if (I[Mi]==1 && Mi==1) { count++; Console.Write(count); for (int i = 1; i <= n; i++) { Console.Write(P[i]); } Console.Write("\n"); } for (int i = 1; i <= Mi; i++) { I[i] = 1; } Mi++; } if (I[Mi] < Mi) { int i = I[Mi]; swap(b(Mi, i), Mi); I[Mi]++; Mi = 1; } } } public void getData() { Console.WriteLine("Podaj ilość elementów: "); int n = Int32.Parse(Console.ReadLine()); P = new int[n]; for (int i = 0; i < n; i++) { P[i] = i + 1; } perm(n - 1); } static void Main(string[] args) { Program p = new Program(); p.getData(); Console.ReadKey(); } } } 不是匹配的,它是一个匹配的空字符串("a")。

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

我将作业写入REPL:

None

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

尝试使用m.group(1)与任何内容都不匹配 - [^ab]++类似,但至少匹配一次。

答案 2 :(得分:0)

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

您可以进行一些测试,并更好地了解Python如何处理*匹配对象具有groups()方法,该方法返回组中的匹配项:

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

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

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

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

>>> 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会在搜索字符串的开头使用额外的空字符串来处理[]*。但是,当使用模式[]+时,它不会这样做。