Python findall,regexp加上|&引用;和分组

Python findall,regexp加上|&引用;和分组,python,regex,Python,Regex,我正在尝试用Python实现。 我想匹配以辅音或“qu”开头的字符串(不管是哪种情况),以便找到第一个字母,所以首先我在做: first_letters = re.findall(r"^[^aeiou]+|^[qQ][uU]", "qualification") 它不起作用(只找到“q”),所以我想我必须在第一组中添加q: first_letters = re.findall(r"^[^aeiouq]+|^[qQ][uU]", "qualification") 这样就行了(它找到的是“qu”

我正在尝试用Python实现。 我想匹配以辅音或“qu”开头的字符串(不管是哪种情况),以便找到第一个字母,所以首先我在做:

first_letters = re.findall(r"^[^aeiou]+|^[qQ][uU]", "qualification")
它不起作用(只找到“q”),所以我想我必须在第一组中添加q:

first_letters = re.findall(r"^[^aeiouq]+|^[qQ][uU]", "qualification")
这样就行了(它找到的是“qu”,而不仅仅是“q”)

但在玩的时候,我发现自己有这样的想法:

first_letters = re.findall(r"{^[^aeiou]+}|{^[qQ][uU]}", "qualification")
这不起作用,因为我想这和我试过的第一个表达是一样的。 但最后这也起了作用:

first_letters = re.findall(r"{^[^aeiou]+}|(^[qQ][uU])", "qualification")
我不知道为什么。
有人能告诉我为什么吗?

颠倒规则的顺序:

>>> re.findall(r"^[qQ][uU]|^[^aeiou]+", "qualification")
['qu']
>>> re.findall(r"^[qQ][uU]|^[^aeiou]+", "boogie")
['b']
>>> re.findall(r"^[qQ][uU]|^[^aeiou]+", "blogie")
['bl']
在第一种情况下,第一个正则表达式
^[^aeiou]+
q
匹配。在第二种情况下,由于您已将
q
添加到第一部分,因此正则表达式引擎将检查第二个表达式并匹配
qu

在其他情况下,我认为第一个表达式的作用与您认为的不同(即大括号内的
^
字符),因此第二个表达式再次匹配


第三个和第四个模式的第一部分,
{^[^aeiou]+}
尝试匹配一个文本大括号
{
,后跟一个
行首
,后跟一个或多个非元音字符,后跟一个文本结束大括号
。由于您没有启用
re.MULTILINE
,我假设您的模式在技术上是有效的,但无法匹配任何输入。

颠倒规则的顺序:

>>> re.findall(r"^[qQ][uU]|^[^aeiou]+", "qualification")
['qu']
>>> re.findall(r"^[qQ][uU]|^[^aeiou]+", "boogie")
['b']
>>> re.findall(r"^[qQ][uU]|^[^aeiou]+", "blogie")
['bl']
在第一种情况下,第一个正则表达式
^[^aeiou]+
q
匹配。在第二种情况下,由于您已将
q
添加到第一部分,因此正则表达式引擎将检查第二个表达式并匹配
qu

在其他情况下,我认为第一个表达式的作用与您认为的不同(即大括号内的
^
字符),因此第二个表达式再次匹配


第三个和第四个模式的第一部分,
{^[^aeiou]+}
尝试匹配一个文本大括号
{
,后跟一个
行首
,后跟一个或多个非元音字符,后跟一个文本结束大括号
。由于您没有启用
re.MULTILINE
,我假设您的模式在技术上是有效的,但无法匹配任何输入。

您应该将
qu
放在
[^aeuio]
之前,否则类会捕获“q”,并且无法匹配。除此之外,不需要
[Qq][Uu]
,只需提供不区分大小写的标志:

first_letters = re.findall(r"^(qu|[^aeiou]+)", "qualification", re.I)
考虑到您可能还将匹配字符串的其余部分,这将更为实际:

start, rest = re.findall(r"^(qu|[^aeiou]+)?(.+)", word, re.I)[0]

您应该将
qu
放在
[^aeuio]
之前,因为否则类会捕获“q”,并且无法匹配。除此之外,不需要
[Qq][Uu]
,只需提供不区分大小写的标志:

first_letters = re.findall(r"^(qu|[^aeiou]+)", "qualification", re.I)
考虑到您可能还将匹配字符串的其余部分,这将更为实际:

start, rest = re.findall(r"^(qu|[^aeiou]+)?(.+)", word, re.I)[0]

|
从左到右运行,并在第一次成功时停止。这就是为什么第一个表达式只有
q
,第二个表达式只有
qu

不确定最终正则表达式的作用,特别是关于
{}
表达式。但是,
|
后面的零件将在限定条件中匹配。也许这就是你所看到的


您可能会发现
re.I
(忽略大小写)标志很有用。

|
从左到右运行,并在第一次成功时停止。这就是为什么第一个表达式只有
q
,第二个表达式只有
qu

不确定最终正则表达式的作用,特别是关于
{}
表达式。但是,
|
后面的零件将在限定条件中匹配。也许这就是你所看到的


你可能会发现
re.I
(忽略大小写)标志很有用。

是的,我发现我可以颠倒规则,但我不明白为什么大括号起作用,^insides做什么??很抱歉,我在谷歌上找不到合适的词来查找。你可以将
(?:…)
添加到你的群中,这样它就不会捕获,例如
r^(?[qQ][uU].[^aeiou]+)“
是的,我发现我可以颠倒规则,但我不明白为什么用大括号的东西会起作用,^insides做什么??很抱歉,我在谷歌上找不到合适的词来查找。你可以将
(?:…)
添加到你的群中,这样它就不会捕获,例如
r^(?[qQ][uU].[^aeiou]+)“