0

如果它在某个标识符之前,我正在寻找一种从字符串中提取子字符串的方法。

string = [food(type, description), newCar(make, year), fruit(shape, colour), usedCar(make, year), ..., identifier(str1, str2)]
identifier = car (newCar and/or usedCar) - extract if both appear or either one appear

Desired outcome

identifier: newCar
first attribute = make
second attribue = year

identifier: usedCar
first attribute = make
second attribue = year

这是我尝试过的,但我似乎只得到了 (..) 的第一次出现。有什么想法可以解决这个问题,如果我也可以将各个字符串放在括号内会更好吗?

sent = '[food(type, description, newCar(make, year), fruit(shape, colour), usedCar(make, year), ..., identifier(str1, str2)]'

id1 = 'newCar'
id2 = 'usedCar'

if id1 in sent:
    carDesc1= sent.split("(")[1].split(")")[0]
    print carDesc1

    if id2 in sent:
        carDesc2= sent.split("(")[1].split(")")[0]
        print carDesc2

Print results: 
type, description
type, description

编辑:感谢您的回复。我不考虑 Dict 的原因之一是因为键必须是唯一的,并且我有一个多行的文本,并且同一行中可能有重复的 newCar 条目。括号内的文字只是通用术语,因为它可能表示制造 = 丰田/福特或年份 = 2010/2013。

4

3 回答 3

0

使用正则表达式:

import re

escaped_identifiers = [re.escape(id) for id in ('newCar', 'usedCar')]
regex = re.compile(r'({})\(([^)]*)\)'.format('|'.join(escaped_identifiers)))
for type, params in regex.findall(the_text):
    make, year = params.split(',')

如果您已经知道标识符将有一make,year对,您也可以提取它们:

import re

escaped_identifiers = [re.escape(id) for id in ('newCar', 'usedCar')]
regex = re.compile(r'({})\(([^,]*),([^)]*)\)'.format('|'.join(escaped_identifiers)))
for type, make, year in regex.findall(the_text):
    # process a match.
于 2013-06-10T22:07:32.950 回答
0
params = sent.split(id1)[1].split(")")[0].lstrip("(")
print params

那应该做你想做的事。话虽如此,有更好的方法可以做到这一点。例如,您可以使用字典将项目存储为键:值对。

于 2013-06-10T21:49:38.467 回答
0

这绝对不是最好的解决方案,但它确实有效。

string = '[food(type, description), newCar(make, year), fruit(shape, colour), usedCar(make, year)]'
# Strip the brackets from the string
string = string.strip('[]')

# Create a dict with identifiers and attributes 
id_attr = dict([i.split('(') for i in string.split('), ')])

# Clean up the attributes and make a list of them
for identifier, attributes in id_attr.items():
    id_attr[identifier] = attributes.strip(')').split(', ')

for i, attrs in id_attr.items():
    # Print the identifier
    print('identifier: {i}'.format(i=i))
    # Print each attribute, numbered
    for num, a in enumerate(attrs):
        print('attribute {num}: {a}'.format(num=num, a=a))
    print('')  # Print empty line

如果要使用标识符查找属性,可以使用 dict.

于 2013-06-10T22:27:47.677 回答