我正在尝试用Python实现Pig Latin。我想要匹配以辅音或“曲”(无论大小写)开头的字符串,以便找到第一个字母,所以一开始我这样做:
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")我也不知道为什么。有人能告诉我为什么吗?
发布于 2012-03-14 23:44:51
颠倒规则的顺序:
>>> 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,所以我假设您的模式在技术上是有效的,但是无法匹配任何输入。
发布于 2012-03-14 23:50:45
您应该将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]发布于 2012-03-14 23:53:02
|从左到右运行,并在第一次成功时停止。这就是为什么第一个表达式只有q,第二个表达式有qu的原因。
不确定最终的正则表达式是做什么的,特别是关于{}表达式。不过,|之后的部分将在资格赛中相匹配。也许这就是你所看到的。
您可能会发现re.I (忽略大小写)标志很有用。
https://stackoverflow.com/questions/9705126
复制相似问题