我刚刚知道[^ ab]会捕捉除a或b之外的任何字符。 所以[^ ab] *应匹配0个或更多字符,其中没有一个是a或b。
然而,python以某种方式将[^ ab] *与a。
相匹配2 2 3
4 2 5
1 5 2
此代码段打印匹配项。我相信我在理解^的使用方面错了,或者在代码中犯了一些错误
答案 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会在搜索字符串的开头使用额外的空字符串来处理[]*
。但是,当使用模式[]+
时,它不会这样做。