如何在R中的strapply中编写正则表达式OR语句

时间:2016-10-09 14:27:28

标签: r regex

我一直在R中使用strapplyc来选择符合一组特定条件的字符串的不同部分。这些已经成功地工作,直到我找到了一部分字符串,其中所需部分可以用两种方式中的一种来定义。

这是一个字符串的示例,其中散布着\ t:

strapplyc(record[i], "Defect:(.*?)Action")

我可以编写strapply语句来捕获Defect:和Action的开头之间的文本:

strapplyc(record[i], "Defect:(.*?)$")

这适用于在缺陷:和动作之间选择所选文本。在某些情况下,字符串没有操作部分,我使用以下代码来捕获这些情况。

strapplyc(record[i], "Defect:(.*?)Action|$")

我一直试图捕获的文本以Action结尾,或者以字符串结尾(使用$)。

这是一直失败的一点。它不返回任何选项。这是我失败的代码:

{{1}}

任何想法我出错或者更好的解决方案都会非常感激。

2 个答案:

答案 0 :(得分:2)

如果你想要一个更有效的解决方案,你可以放弃。*?匹配并展开您的模式,如:

Defect:((?:[^A]+|A(?!ction))*)

匹配Defect:后跟任意数量的字符,这些字符不是AA,而不是ction。这避免了延迟点匹配所需的扩展。它将适用于两种方式,因为它会在它到达Action或字符串结尾时停止匹配。

根据Wiktor的建议,您也可以使用

Defect:([^A]*(?:A(?!ction)[^A]*)*)

当字符串中有许多A时,速度会快一点。

您可能需要考虑使用A(?!ction:)A(?!ction\s*:),以避免错误的早期匹配。

答案 1 :(得分:1)

交替运算符|是具有最低优先级的正则表达式运算符。这意味着正则表达式Defect:(.*?)Action|$实际上是Defect:(.*?)Action$的组合 - 因为空字符串是$的有效匹配,所以正则表达式返回空字符串。

要解决此问题,您应该将正则表达式Defect:(.*?)ActionDefect:(.*?)$与OR结合使用:

Defect:(.*?)Action|Defect:(.*?)$

或者,您可以Action|$Defect:(.*?)(?:Action|$) 括在一个组中:

from django.contrib.auth.models import User
from django.db.models import Max

users = User.objects.all()
max = users.aggregate(Max('id'))