python - 正则表达式解析日志

时间:2016-04-18 06:40:20

标签: python regex python-2.7

我有以下要解析的日志行

<log pos_start="40652288" end_position="40689664" log_type="1" length="37376" block_id="4024" block_position="18"/>

我正在使用python正则表达式,这是我到目前为止所做的

regexParse = re.match(".*pos_start=(\d+).*end_position=(\d+).*log_type=(\d+).*length=(\d+).*block_id=(\d+).*block_position=(\d+).*",StatelogLine)
start_position = regexParse.group(1)
end_position = regexParse.group(2)

我收到以下错误

AttributeError: 'NoneType' object has no attribute 'group'

任何人都有任何想法是什么问题

4 个答案:

答案 0 :(得分:3)

非常简单:由于未指定双引号,您的regex does not match your string 就是这样。如果您添加your regex works 作为副节点,点星汤(.*)的效率非常低。为什么不使用解析器呢?

使用BeautifulSoup考虑以下代码:

from bs4 import BeautifulSoup
string = """<log pos_start="40652288" end_position="40689664" log_type="1" length="37376" block_id="4024" block_position="18"/>"""
xml = BeautifulSoup(string)
print xml.log["pos_start"]
# 40652288

之后你可以像数组一样访问你的元素,不需要德鲁伊正则表达式。看看their homepage and documentation

答案 1 :(得分:2)

您可以解析该行,例如您同时获得键和值:Regex Demo

(\w+)="(\d+)"

如果你需要,你也可以创建一个字典:

import re

s = '<log pos_start="40652288" end_position="40689664" log_type="1" length="37376" block_id="4024" block_position="18"/>'

matches = re.findall(r'(\w+)="(\d+)"', s)
#[('pos_start', '40652288'),
# ('end_position', '40689664'),
# ('log_type', '1'),
# ('length', '37376'),
# ('block_id', '4024'),
# ('block_position', '18')]

d = dict(matches)
#{'block_id': '4024',
# 'block_position': '18',
# 'end_position': '40689664',
# 'length': '37376',
# 'log_type': '1',
# 'pos_start': '40652288'}

答案 2 :(得分:1)

你的正则表达式是不正确的。您需要转义双引号才能使其成功匹配。

.*pos_start=\"(\d+)\" +end_position=\"(\d+)\" +log_type=\"(\d+)\" +length=\"(\d+)\" +block_id=\"(\d+)\" +block_position=\"(\d+)\"

答案 3 :(得分:0)

你忘了双qoutes

regexParse = re.match(".*pos_start=\"(\d+)\".*end_position=\"(\d+)\".*log_type=\"(\d+)\".*length=\"(\d+)\".*block_id=\"(\d+)\".*block_position=\"(\d+)\".*",s)