2

假设我有一个格式如下的字符串:
myString={"name", "age", "address", "contacts", "Email"}

我需要myString使用 python 将所有项目放入列表中。这是我所做的:

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

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

line是保存我的文本文件内容的变量。

我必须对我的正则表达式进行哪些更改才能获取所有项目myString

4

3 回答 3

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(',')]

但可能最好的方法是将两者结合起来:

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 回答
3
mystr = """myString={"name", "age", "address", "contacts", "Email"}"""
print mystr.split('"')[1::2]
于 2012-06-28T21:07:06.883 回答
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 回答