基本上我想在结束的方括号之间删除文本"]"和一个单词的开头(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
我在这里缺少什么?
答案 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)
答案 1 :(得分:0)
改为使用:
\]([^A-Z]*)
你的正则表达式\](.*)[^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))
.-
.-