Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式负查找_Python_Regex - Fatal编程技术网

Python正则表达式负查找

Python正则表达式负查找,python,regex,Python,Regex,我们解析由自动化脚本创建的日志。我们关心的一个典型问题是以下行中的字符串:'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)' 问题是,有些日志是手动创建的,用户自己输入这些信息。要提醒自己已使用模板添加了一个对话框,请执行

我们解析由自动化脚本创建的日志。我们关心的一个典型问题是以下行中的字符串:
'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)'
问题是,有些日志是手动创建的,用户自己输入这些信息。要提醒自己已使用模板添加了一个对话框,请执行以下操作:

02:24:50.655 - INFO   - gui: Step Dialog: For test results management purposes, specify the build in which the test is executed in the following format, build version: 'specify version here'
02:25:04.905 - INFO   - gui:     Response: OK
02:25:04.905 - INFO   - gui:     Comments: 'build version: '1.11.11''
目前我的正则表达式是
*[Bb]uild[Vv]版本:*\s*(*
但出于某种原因,它与上面的第一行和第三行都匹配

编辑:

“[Bb]“,”和“:\s”适用于使用多个冒号和空格(大写为“Build”)以不完全正确的格式输入信息的用户。请建议清理这些信息,我对regexs比较陌生。

您很接近,但它仍然匹配,因为它可以找到一个满足
*
要求的字符串,而无需修改前面是
Step Dialog
。肯定和否定断言只会影响它们周围的模式。因此,您必须强制它检查您不希望匹配的每个字符
Step Dialog

试试这个:

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

`^(?:(?!步骤对话框)。*[Bb]uild[Vv]版本:*\s*(?!.*有几种方法可以实现这一点,但非常接近

`.*(?<!Step Dialog.*)[Bb]uild [Vv]ersion:*\s*(?!.*<)'?([^']*)'`
`^(?!.*Step Dialog).*[Bb]uild [Vv]ersion:*\s*(?!.*<)'?([^']*)'`
`.*?
Chriszuma的模式也应该有效。使用你最喜欢的模式。如果性能是一个考虑因素,你可以对这三种模式进行基准测试,看看哪一种更快。我的感觉是它将是以“`.(?””开头的模式,但我不能确定


编辑:正如Ekhumaro指出的,第一个在Python中不起作用。但是第二个应该可以。

非常好,谢谢!我还学习了(?:…)从这一点来看,这是我以前一直想知道的功能。这些模式中的第一个将给出一个编译错误,因为后面的lookbehind不是固定宽度。@ekhumoro-很好的捕获。我忘记了Python对可变宽度lookbehinds的厌恶。edited为什么会被否决?如果它仍然不正确,请解释原因。
`.*(?<!Step Dialog.*)[Bb]uild [Vv]ersion:*\s*(?!.*<)'?([^']*)'`
`^(?!.*Step Dialog).*[Bb]uild [Vv]ersion:*\s*(?!.*<)'?([^']*)'`