Разбор и группировка текста в строку с использованием Python - PullRequest
1 голос
/ 11 ноября 2010

Мне нужно разобрать серию коротких строк, которые состоят из 3 частей: вопрос и 2 возможных ответа. Строка будет иметь следующий формат:

Это вопрос "answer_option_1 в кавычках" "answer_option_2 в кавычках"

Мне нужно указать часть вопроса и два возможных варианта ответа в одинарных или двойных кавычках.

Ex .: Какого цвета небо сегодня? "синий" или "серый"
Кто победит в игре "Мичиган" "Штат Огайо"

Как мне это сделать на python?

Ответы [ 4 ]

1 голос
/ 11 ноября 2010
>>> import re
>>> s = "Who will win the game 'Michigan' 'Ohio State'"
>>> re.match(r'(.+)\s+([\'"])(.+?)\2\s+([\'"])(.+?)\4', s).groups()
('Who will win the game', "'", 'Michigan', "'", 'Ohio State')
1 голос
/ 11 ноября 2010

Если ваш формат простой, как вы говорите (т.е. , а не , как в ваших примерах), вам не нужно регулярное выражение.Просто split строка:

>>> line = 'What color is the sky today? "blue" "grey"'.strip('"')
>>> questions, answers = line.split('"', 1)
>>> answer1, answer2 = answers.split('" "')
>>> questions
'What color is the sky today? '
>>> answer1
'blue'
>>> answer2
'grey'
0 голосов
/ 21 декабря 2010

Pyparsing даст вам решение, которое адаптируется к некоторой изменчивости во входном тексте:

questions = """\
What color is the sky today? "blue" or "grey"
Who will win the game 'Michigan' 'Ohio State'""".splitlines()

from pyparsing import *

quotedString.setParseAction(removeQuotes)
q_and_a = SkipTo(quotedString)("Q") + delimitedList(quotedString, Optional("or"))("A")

for qn in questions:
    print qn
    qa = q_and_a.parseString(qn)
    print "qa.Q", qa.Q
    print "qa.A", qa.A
    print

Будет печатать:

What color is the sky today? "blue" or "grey"
qa.Q What color is the sky today? 
qa.A ['blue', 'grey']

Who will win the game 'Michigan' 'Ohio State'
qa.Q Who will win the game 
qa.A ['Michigan', 'Ohio State']
0 голосов
/ 11 ноября 2010

Одна возможность заключается в том, что вы можете использовать регулярные выражения.

import re
robj = re.compile(r'^(.*) [\"\'](.*)[\"\'].*[\"\'](.*)[\"\']')
str1 = "Who will win the game 'Michigan' 'Ohio State'"
r1 = robj.match(str1)
print r1.groups()
str2 = 'What color is the sky today? "blue" or "grey"'
r2 = robj.match(str2)
r2.groups()

Вывод:

('Who will win the game', 'Michigan', 'Ohio State')
('What color is the sky today?', 'blue', 'grey')
...