为什么我的正则表达式在测试人员中工作但在re.search中没有?

时间:2018-04-11 15:11:48

标签: python regex

基本上我想在结束的方括号之间删除文本"]"和一个单词的开头(CALL或RETURN)

使用字符串:

[2018-01-18 18:22:28,516] .- CALL do.something(key=True)

[2018-01-18 18:22:28,517] .- RETURN do.something

预期产出:

.- .-

我的代码看起来像这样:

def find_middle_bit(string):
    string_of_interest = re.search(r"\](.*)[^A-Za-z]", string)
    print str(string.strip())
    if string_of_interest:
        print string_of_interest.group(1)


line = "[2018-01-18 18:22:28,516] .- CALL do.something(key=True)"
find_middle_bit(line)

实际输出:

.- CALL do.something(key=True

我在这里缺少什么?

3 个答案:

答案 0 :(得分:1)

一种选择是使用外观来定位您要捕获的文本:

string = "[2018-01-18 18:22:28,516] .- CALL do.something(key=True)"
string_of_interest = re.search(r"(?<=\]\s)(.*?)(?=\s(?:CALL|RETURN))", string)
print str(string.strip())
if string_of_interest:
    print string_of_interest.group(1)

.-          <-- (this is what gets printed)

Demo

答案 1 :(得分:0)

改为使用:

\]([^A-Z]*)

Online Demo

你的正则表达式\](.*)[^A-Za-z]首先匹配一个右括号](没关系),然后是一些任意数字后跟一个非字母的字符。因为.*是贪婪的,所以它需要尽可能多的字符。在你的情况下,它到达字符串的末尾然后后退一次以匹配)[^A-Za-z]

答案 2 :(得分:0)

我倾向于发现使用组匹配对这类工作非常有帮助。需要较少的脑力。考虑:

from functools import partial
import re

lines = ['[2018-01-18 18:22:28,516] .- CALL do.something(key=True)', 
         '[2018-01-18 18:22:28,517] .- RETURN do.something']
extract = partial(re.sub, '\[.*?\]\s*(.*?)\s.*', '\g<1>')
for line in lines:
   print(extract(line))

输出

.-
.-