Python regex否定查找

2024-09-27 21:22:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我们解析由自动脚本创建的日志。我们关心的一个典型问题是来自以下行的字符串:'1.10.07-SNAPSHOT (1.10.07-20110303.024749-7)'

15:28:02.115 - INFO   - TestLib: Successfully retrieved build version: '1.11.11-SNAPSHOT (1.11.11-20110303.024749-7)'

问题是,有些日志是手动创建的,用户自己输入这些信息。为了提醒自己使用模板添加了对话框的格式:

^{pr2}$

我的regex当前是.*[Bb]uild [Vv]ersion:*\s*(?!.*<)'?([^']*)''(?!.*<)'是我第一次尝试避免这个问题,因为有些用户会写''。但这并不能解释上述情况。我认为正确的做法是,如果'Step Dialog'出现在行中,那么它就不匹配了,但是根据regexr的说法,我的写尝试似乎失败了(因为某些原因,它不允许我共享保存表单的链接)。我以为消极的回头看会是这样的:(?<!Step Dialog)并导致这样的结果:

`(?<!Step Dialog).*[Bb]uild [Vv]ersion:*\s*(?!.*<)'?([^']*)'`

但出于某种原因,这和上面的第一行和第三行都匹配。在

编辑:
“[Bb]”和“:\s”用于使用多个冒号和空格(大写为“Build”)以不完全正确的格式输入信息的用户。建议清理这一点总的来说是赞赏的,我是相对较新的regex。在


Tags: 字符串用户脚本信息格式stepsnapshotregex
2条回答

有几种方法可以做到,但你已经很接近了。在

`.*(?<!Step Dialog.*)[Bb]uild [Vv]ersion:*\s*(?!.*<)'?([^']*)'`
`^(?!.*Step Dialog).*[Bb]uild [Vv]ersion:*\s*(?!.*<)'?([^']*)'`

克里斯祖马的模式也应该起作用。用你最喜欢的。如果考虑性能,您可以对这三种模式进行基准测试,看看哪个更快。我的感觉是,它将是一个以“`”开头的`,但我不能肯定。在

编辑:正如ekhurvo指出的,the Python regex engine requires fixed-length lookbehinds,所以第一个在Python中不起作用。第二个应该没问题。在

您很接近,但它仍然匹配,因为它可以找到满足.*的字符串,而不必在前面加Step Dialog。正面和负面的断言只会影响它们周围的模式。因此,您必须强制它检查您不想匹配的每个字符Step Dialog。在

试试这个:

`^(?:(?!Step Dialog).)*[Bb]uild [Vv]ersion:*\s*(?!.*<)'?([^']*)'`

现在,它确保^(行首)和[Bb]uild [Vv]ersion之间的每个字符都是而不是字符串Step Dialog。在

你会注意到我也把它改成了积极的展望,因为它更容易理解发生了什么。在

相关问题 更多 >

    热门问题