我正在尝试用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")
我不知道为什么。 有人可以告诉我为什么?
答案 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
(忽略大小写)标记有用。