[英]regex python strip characters
我有一個文本文件:
z.server(y.host=>["x.012345","x.054321","x.045455"], :stop => 10)
z.server(y.host=>["x.067891","x.043215","x.045195"], :stop => 10)
z.server(y.host=>["x.012355","x.075321","x.045855"], :stop => 10)
我有一個腳本要提取以下數據:
y.host 012345 012345 012345
y.host 067891 043215 045195
y.host 012355 075321 075321
當我運行python腳本時,我得到:
y.host 012345","x.054321","x.045455
y.host 067891","x.043215","x.045195
y.host 012355","x.075321","x.045855
我想念什么? 感謝任何幫助。
這是我的腳本:
#!/usr/bin/python
import re,sys
f = "test.txt"
rgxxid = re.compile('(^z\.\w+\((\w+\.\w+)=>\["x\.(\d+.*)"\]).\s+:\w+\s+=>\s\d+\)')
for l in open(f,'r').readlines():
lm = re.match(rgxxid,l)
if lm:
hlm = lm.group(2)
xid = lm.group(3)
print hlm, xid
else:
sys.stderr.write("No XID match. "+l+"\n")
簡而言之,這是您當前正則表達式的問題:
["x\.(\d+.*)"\]
^^^
模式\\d+.*
表示要匹配一個或多個數字, 然后匹配直到最后一個引號的所有數字。 您在輸出中看到的內容確認了這一點:
y.host 012345","x.054321","x.045455
捕獲組已經消耗了所有東西,直到數字列表的末尾。 相反,請嘗試使用以下模式:
^z\.\w+\((\w+\.\w+)=>\["x\.(\d+)","x\.(\d+)","x\.(\d+)"\],\s+:\w+\s+=>\s\d+\)
在這里,我為三個數字中的每個數字提供了三個顯式捕獲組。 這是正則表達式的演示:
您更新后的腳本應如下所示:
for l in open(f,'r').readlines():
lm = re.match(rgxxid,l)
if lm:
term1 = lm.group(1)
term2 = lm.group(2)
term3 = lm.group(3)
term4 = lm.group(4)
print term1, term2, term3, term4
else:
sys.stderr.write("No XID match. "+l+"\n")
您可能會發現使用pyparsing更容易。 無疑,它可以更輕松地捕獲您作為示例提供的各行的語法。
注意:
。
import pyparsing as pp
server = pp.Word(pp.alphas+'.')
item = pp.Suppress('"x.') + pp.Word(pp.nums) + pp.Suppress('"')
one_line = server.suppress() + pp.Suppress('(') + server + pp.Suppress('=>[') + item + pp.OneOrMore(pp.Suppress(',') + item)
lines = '''\
z.server(y.host=>["x.012345","x.054321","x.045455"], :stop => 10)
z.server(y.host=>["x.067891","x.043215","x.045195"], :stop => 10)
z.server(y.host=>["x.012355","x.075321","x.045855"], :stop => 10)'''
for line in lines.split('\n'):
print (line)
parsed = one_line.parseString(line)
print ('\t', parsed[:5])
輸出:
z.server(y.host=>["x.012345","x.054321","x.045455"], :stop => 10)
['y.host', '012345', '054321', '045455']
z.server(y.host=>["x.067891","x.043215","x.045195"], :stop => 10)
['y.host', '067891', '043215', '045195']
z.server(y.host=>["x.012355","x.075321","x.045855"], :stop => 10)
['y.host', '012355', '075321', '045855']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.