-1

一部のXMLを解析して、タグ名が「ip」の要素を探しています。最終的には、IPアドレスを含む文字列のリストが必要です。これが私が試したことです:

def parseHosts(xmldoc):
  hostsNode = xmldoc.firstChild
  xmlList = hostsNode.getElementsByTagName("ip")

  ipList = []
  for ip in xmlList:
    ipList.append(ip.childNodes[0].nodeValue)

  print ipList
>>>[u'172.16.60.92', u'172.16.60.89', u'\n              ', u'172.16.60.90', u'172.16.60.91', u'172.16.60.93']

それで大丈夫です。しかし、IPアドレスの文字列のリストが必要です...空のノードは必要ありません。このようなアドレスのちょうどいいリスト:

['172.16.60.1', '172.16.60.5', 172.16.60.100']

リスト内包表記で少し正規表現を試しました

  regex = re.compile(r'172\.16\.[0-9]*\.[0-9]*')
  [m.group(0) for l in ipList for m in [regex.search(1)] if m]

しかし、次のエラーが発生します

File "myParser.py", line 47, in parseHosts
[m.group(0) for l in ipList for m in [regex.search(1)] if m]
TypeError: expected string or buffer

ipListが使用しているタイプではわからないかもしれませんしtype(ipList)、これを文字列にする方法もわからないかもしれません。

また...そのUnicodeのものを取り除くのは良いことです。

明らかに私はここのどこかで最深部を離れましたが、どこを見ればよいのかわかりません。

4

2 に答える 2

3

元のコードに戻りましょう。それはこれで終わりますipList

[u'172.16.60.92', u'172.16.60.89', u'\n              ', u'172.16.60.90', u'172.16.60.91', u'172.16.60.93']

ここでの唯一の問題は、空白でいっぱいの文字列と、その中にIPアドレスを持つ文字列が含まれていることです。

だから、事後にそれをフィルタリングしてみましょう:

In [51]: ipList = [u'172.16.60.92', u'172.16.60.89', u'\n              ', u'172.16.60.90', u'172.16.60.91', u'172.16.60.93']

In [52]: ipList = [ip for ip in ipList if ip.strip()]

In [53]: ipList
Out[53]: 
['172.16.60.92',
 '172.16.60.89',
 '172.16.60.90',
 '172.16.60.91',
 '172.16.60.93']

そして、あなたは完了です!

なぜこれが機能するのですか?さて、ip.strip()左側と右側からすべての空白を削除します。結果をifステートメントに貼り付けると、何かが残っている場合はtrueになり、何も残っていない場合はfalseになります。

ただし、明らかに、同じ条件を元のループに戻し、append呼び出しの前に置くだけで、まったく同じ効果が得られます。

def parseHosts(xmldoc):
  hostsNode = xmldoc.firstChild
  xmlList = hostsNode.getElementsByTagName("ip")

  ipList = []
  for ip in xmlList:
    ipstr = ip.childNodes[0].nodeValue
    if ipstr.strip():
      ipList.append(ipstr)

しかし、その全体ipListは明らかにリスト内包表記の長いバージョンにすぎないので、次のようになります。

def parseHosts(xmldoc):
  hostsNode = xmldoc.firstChild
  xmlList = hostsNode.getElementsByTagName("ip")
  ipList = [ip.childNodes[0].nodeValue for ip in xmlList
            if ip.childNodes[0].nodeValue.strip()]

これを修正するあなたの試みに関して:

[m.group(0) for l in ipList for m in [regex.search(1)] if m]

ネストされたリスト内包が何をしているのかすぐにわからないときはいつでも、それを2つの内包に分割してください。

しかし、それを明示的なループとして書き直してみましょう。これにより、理解がさらに容易になるだけでなく、デバッグもはるかに簡単になります。

result = []
for l in ipList:
    for m in [regex.search(1)]:
        if m:
            result.append(m.group(0))

これを実行すると、3行目に例外が発生し、その理由は明らかです。

于 2013-01-08T22:48:20.107 に答える
0

あなたはただ使うことができますfilter(regex.match,ipList)

import re
ipList=[u'172.16.60.92', u'172.16.60.89', u'\n              ', u'172.16.60.90', u'172.16.60.91', u'172.16.60.93']
regex = re.compile(r'172\.16\.[0-9]*\.[0-9]*')
filter(regex.match,ipList)

out:

[u'172.16.60.92',
 u'172.16.60.89',
 u'172.16.60.90',
 u'172.16.60.91',
 u'172.16.60.93']
于 2013-01-08T22:56:54.313 に答える