我一直在R中使用strapplyc来选择符合一组特定条件的字符串的不同部分。这些已经成功地工作,直到我找到了一部分字符串,其中所需部分可以用两种方式中的一种来定义。
这是一个字符串的示例,其中散布着\ t:
strapplyc(record[i], "Defect:(.*?)Action")
我可以编写strapply语句来捕获Defect:和Action的开头之间的文本:
strapplyc(record[i], "Defect:(.*?)$")
这适用于在缺陷:和动作之间选择所选文本。在某些情况下,字符串没有操作部分,我使用以下代码来捕获这些情况。
strapplyc(record[i], "Defect:(.*?)Action|$")
我一直试图捕获的文本以Action结尾,或者以字符串结尾(使用$)。
这是一直失败的一点。它不返回任何选项。这是我失败的代码:
{{1}}
任何想法我出错或者更好的解决方案都会非常感激。
答案 0 :(得分:2)
如果你想要一个更有效的解决方案,你可以放弃。*?匹配并展开您的模式,如:
Defect:((?:[^A]+|A(?!ction))*)
匹配Defect:
后跟任意数量的字符,这些字符不是A
或A
,而不是ction
。这避免了延迟点匹配所需的扩展。它将适用于两种方式,因为它会在它到达Action
或字符串结尾时停止匹配。
根据Wiktor的建议,您也可以使用
Defect:([^A]*(?:A(?!ction)[^A]*)*)
当字符串中有许多A
时,速度会快一点。
您可能需要考虑使用A(?!ction:)
或A(?!ction\s*:)
,以避免错误的早期匹配。
答案 1 :(得分:1)
交替运算符|
是具有最低优先级的正则表达式运算符。这意味着正则表达式Defect:(.*?)Action|$
实际上是Defect:(.*?)Action
和$
的组合 - 因为空字符串是$
的有效匹配,所以正则表达式返回空字符串。
要解决此问题,您应该将正则表达式Defect:(.*?)Action
和Defect:(.*?)$
与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'))