如果你能找到一個可靠的庫來分析這些字符串,那顯然是你最好的選擇。
不及格的,如果你想嘗試與pyparsing
的解決方案,這可能會幫助你開始:
import re
from pyparsing import Combine, Literal, Regex, White, Word
from pyparsing import alphanums, alphas, nums
data = '127.0.0.1 - - [15/Jan/2014 10:21:23] "GET /" 200 -'
ip_octet = Word(nums, min=1, max=3)
ip_sep = Literal('.')
ip = Combine(ip_octet + ip_sep
+ ip_octet + ip_sep
+ ip_octet + ip_sep
+ ip_octet)
day = Word(nums, min=1, max=2)
month = Word(alphas, exact=3)
year = Word(nums, exact=4)
date_sep = Literal('/')
date = Combine(day + date_sep
+ month + date_sep
+ year)
hms = Word(nums, min=1, max=2)
time_sep = Literal(':')
time = Combine(hms + time_sep
+ hms + time_sep
+ hms)
datetime = Literal('[').suppress() + date + time + Literal(']').suppress()
method = Word(alphas) # GET, etc
# path characters per RFC 1738/<http://stackoverflow.com/a/1856809/1535629>
path = Word(alphanums + "$-_.+!*'(),/%")
req_enclosure = Literal('"').suppress()
req = req_enclosure + method + path + req_enclosure
code = Word(nums, exact=3) # HTTP status code
nodash = Literal('-').suppress()
parser = ip + nodash + nodash + datetime + req + code + nodash
result = parser.parseString(data)
print(result)
結果:
['127.0.0.1', '15/Jan/2014', '10:21:23', 'GET', '/', '200']
這是一個很大比使用re
更詳細,在我看來,確實如此,但也更具可讀性和可維護性。
另外,如果你願意,你可以使用正則表達式中pyparsing
,如下:
import re
from pyparsing import Regex
data = '127.0.0.1'
ip_re = re.compile(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}')
ip = Regex(ip_re)
result = ip.parseString(data)
print(result)
結果:
['127.0.0.1']
這使你與混合選項,以任何方式匹配正則表達式和pyparsing
功能。
稱爲如果你發現自己無法找到能夠分析這些字符串庫,可以考慮使用['pyparsing'](http://pyparsing.wikispaces.com/)而不是使用正則表達式來提高健壯性。 – senshin
@senshin好的謝謝你的提示,我會檢查。 – DevZer0