簡體   English   中英

正則表達式python條形字符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM