2

次の形式の文字列があるとします。
myString={"name", "age", "address", "contacts", "Email"}

myStringPythonを使用してのすべてのアイテムをリストに入れる必要があります。これが私がしたことです:

r = re.search("myString=\{\"(.+)\", $\}", line)

if r:
     items.append(r.group(1)) 
print(items)

これが私lineのテキストファイルの内容を保持する変数です。

すべてのアイテムを取得するには、正規表現にどのような変更を加える必要がありmyStringますか?

4

3 に答える 3

3
mystr = """myString={"name", "age", "address", "contacts", "Email"}"""
print mystr.split('"')[1::2]
于 2012-06-28T21:07:06.883 に答える
3

有効な集合の表記法のように見えるので、代わりにastモジュールを使用して解析できます。

import ast
mystr  = 'myString={"name", "age", "address", "contacts", "Email"}'

tree   = ast.parse(mystr)
name   = tree.body[0].targets[0].id
values = [val.s for val in tree.body[0].value.elts]

print name, values
# prints: myString ['name', 'age', 'address', 'contacts', 'Email']

編集:入力ファイルの実際の形式に照らして、正規表現を使用してブロックを解析してから、上記のようにブロックを解析するか、以下のように引用符を削除します。

import re
block_re = re.compile(r'v_dims=\{(.*?)\}', re.S)

with open("C:\XXXX\nemo\Test.mrk") as f:
    doc = f.read()

block = block_re.search(doc)
[s.strip().strip('"') for s in block.group(1).split(',')]

しかし、おそらく最良の方法は、2つを組み合わせることです。

import ast
import re

with open("C:\XXXX\nemo\Test.mrk") as f:
    doc = f.read()

block_re = re.compile(r'v_dims=\{.*?\}', re.S)
tree     = ast.parse(block_re.search(doc).group(0))

print [val.s for val in tree.body[0].value.elts]
# ['name', 'age', 'address', 'contacts', 'Email']
于 2012-06-28T21:13:54.320 に答える
0

文字列はその構造を持つことが保証されていますか?もしそうなら、あなたはすることができます:

>>> s = 'myString={"name", "age", "address", "contacts", "Email"}'
>>> data = s[s.find('{') + 1:s.rfind('}')]
>>> data
'"name", "age", "address", "contacts", "Email"'
>>> result = [t.strip() for t in data.split(',')]
>>> result
['"name"', ' "age"', '"address"', '"contacts"', '"Email"']

ご覧のとおり、次の手順を実行します。

  1. {と文字の間の文字列を検索します}
  2. 文字列をコンマで分割します。これにより、文字列のリストが表示されます。
  3. 次に、これらの文字列からスペースを取り除き、アイテムを取得します。

引用符が不要な場合は、上記の結果リストの各文字列から最初と最後の文字を削除できます。

于 2012-06-28T21:08:25.053 に答える