Python和正则表达式:用括号分割字符串

时间:2014-09-13 00:35:20

标签: python regex

在日志文件中,我在每一行都有以下格式:

[date] [thread] [loglevel] [class] some text describing the event that happened.

我想遍历日志并拆分字符串,以便我有以下内容: [' date',' thread',' loglevel',' class','一些文字描述发生的事件。& #39]

我很确定我需要使用re.split来执行此操作,但我的正则表达式很糟糕。

尝试这样的事情:

  for line in open(sys.argv[1]).xreadlines():
    parts = re.split(r'[[]]',line)

感谢任何帮助!

4 个答案:

答案 0 :(得分:3)

试试这个:

>>> log = '[date] [thread] [loglevel] [class] some text describing the event that happened.'
>>> [part.strip() for part in re.split('[\[\]]', log) if part.strip()]
['date', 'thread', 'loglevel', 'class', 'some text describing the event that happened.']

当字符串看到[或]时会被拆分。在re.split的模式中,您需要转义这些字符。我添加了part.strip()和part.strip()以删除不需要的空格和空字符串

答案 1 :(得分:1)

首先,\[(.*?)\]将匹配括号中的任何内容。

所以,如果你想这样做四次:

r = r'\[(.*?)\].*?' * 4
date, thread, loglevel, class = re.match(r, log).groups()

而且,为了得到余数:

r = r'\[(.*?)\].*?' * 4 + r'(.*)'    
date, thread, loglevel, class, text = re.match(r, log).groups()

或者,如果您愿意明确地写出来:

r = r'\[(.*?)\].*?\[(.*?)\].*?\[(.*?)\].*?\[(.*?)\].*?(.*)'

......但就个人而言,我发现这种方式令我感到头疼。


但如果您在使用正则表达式时遇到困难,那么简化操作可能会更容易。例如......

首先,找到括号之间的所有内容:

date, thread, loglevel, class = re.findall(r'\[(.+?)\]', log)

然后找到最后一个括号后的所有内容:

text = log.rpartition(']')[-1].lstrip()

它显然比单一的正则表达式解决方案更冗长,并且它可能也会更慢,但如果您能够理解并自己维护它,那么它的价值会更高从长远来看。

答案 2 :(得分:0)

您可以尝试匹配字符串而不是拆分字符串。

>>> import re
>>> s = "[date] [thread] [loglevel] [class] some text describing the event that happened."
>>> m = re.findall(r'(?<=\[)[^]]*|(?<=]\s)[^\]\[]+', s)
>>> m
['date', 'thread', 'loglevel', 'class', 'some text describing the event that happened.']

答案 3 :(得分:0)

\]\s\[|\]\s(?=\w)|^\[

你可以试试这个正则表达式。

参见演示。

http://regex101.com/r/lU7jH1/2