Python findall,正则表达式用“|”和分组

时间:2012-03-14 15:41:25

标签: python regex

我正在尝试用Python实现Pig Latin。 我想匹配以辅音或“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")

我不知道为什么。 有人可以告诉我为什么?

3 个答案:

答案 0 :(得分:2)

颠倒规则的顺序:

>>> 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

在你的其他情况下,我认为第一个表达式不符合你的想法(即大括号内的^个字符),所以它是第二个再次匹配的表达式。

第3和第4个模式的第一部分{^[^aeiou]+}正在尝试匹配文字大括号{后跟start-of-line后跟一个或多个非元音字符,其次通过文字结束大括号}。由于您没有启用re.MULTILINE,我假设您的模式在技术上有效但无法匹配任何输入。

答案 1 :(得分:2)

您应该将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]

答案 2 :(得分:0)

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

不确定你的最终正则表达式是做什么的,特别是关于{}表达式。但|之后的部分将在资格中匹配。也许这就是你所看到的。

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