regex python strip字符

2024-09-30 01:33:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文本文件:

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)

我有一个脚本,我想提取以下数据:

^{pr2}$

当我运行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")

Tags: 数据re脚本hostservermatchsysgroup
2条回答

您可能会发现使用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])

输出:

^{pr2}$

简而言之,您当前的regex存在以下问题:

["x\.(\d+.*)"\]
         ^^^

模式\d+.*表示匹配一个或多个数字,后跟任何直到最后一个引号。您在输出中看到的情况证实了这一点:

^{pr2}$

在数字列表结束之前,捕获组已经消耗了所有内容。相反,请尝试使用以下模式:

^z\.\w+\((\w+\.\w+)=>\["x\.(\d+)","x\.(\d+)","x\.(\d+)"\],\s+:\w+\s+=>\s\d+\)

在这里,我为这三个numner提供了三个显式的捕获组。下面是正则表达式的演示:

Demo

更新后的脚本应该如下所示:

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")

相关问题 更多 >

    热门问题