首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python findall,regexp with "|“和grouping

Python findall,regexp with "|“和grouping
EN

Stack Overflow用户
提问于 2012-03-14 23:41:25
回答 3查看 529关注 0票数 0

我正在尝试用Python实现Pig Latin。我想要匹配以辅音或“曲”(无论大小写)开头的字符串,以便找到第一个字母,所以一开始我这样做:

代码语言:javascript
复制
first_letters = re.findall(r"^[^aeiou]+|^[qQ][uU]", "qualification")

它不起作用(只找到"q"),所以我想我必须在第一组中添加q:

代码语言:javascript
复制
first_letters = re.findall(r"^[^aeiouq]+|^[qQ][uU]", "qualification")

所以这是可行的(它找到"qu“,而不仅仅是"q")!

但我发现自己有这样的问题:

代码语言:javascript
复制
first_letters = re.findall(r"{^[^aeiou]+}|{^[qQ][uU]}", "qualification")

这不起作用,因为我想它和我尝试的第一个表达式是一样的。但最终这也起到了作用:

代码语言:javascript
复制
first_letters = re.findall(r"{^[^aeiou]+}|(^[qQ][uU])", "qualification")

我也不知道为什么。有人能告诉我为什么吗?

EN

回答 3

Stack Overflow用户

发布于 2012-03-14 23:44:51

颠倒规则的顺序:

代码语言:javascript
复制
>>> 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,所以我假设您的模式在技术上是有效的,但是无法匹配任何输入。

票数 2
EN

Stack Overflow用户

发布于 2012-03-14 23:50:45

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

代码语言:javascript
复制
first_letters = re.findall(r"^(qu|[^aeiou]+)", "qualification", re.I)

考虑到您可能还会匹配字符串的其余部分,这将更加实用:

代码语言:javascript
复制
start, rest = re.findall(r"^(qu|[^aeiou]+)?(.+)", word, re.I)[0]
票数 2
EN

Stack Overflow用户

发布于 2012-03-14 23:53:02

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9705126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档