2010-11-04 2 views
0

У меня есть текстовая строка по строке, которая содержит много полей и их значение, разделенных:, если какая-либо строка не имеет никакого значения поля, то это поле не будет существовать в этой строке напримерИзвлечь поля из строки в python

First line: 
A:30 B: 40 TS:1/1/1990 22:22:22 
Second line 
A:30 TS:1/1/1990 22:22:22 
third line 
A:30 B: 40 

Но подтверждается, что при максимальных 3 полях возможны одна строчка, а их имя будет A, B, TS. при написании сценария python для этого, я столкнулся с нижеперечисленными проблемами: 1) Мне нужно извлечь из каждой строки, которые существуют в поле, и каковы их значения 2) Поле field field также имеет разделитель '' (SPACE) .so не удалось получить полную стоимость TS (1/1/1990 22:22:22)

Выход valueshould быть извлечена как этот

First LIne: 
A=30 
B=40 
TS=1/1/1990 22:22:22 

Second Line: 
A=30 

TS=1/1/1990 22:22:22 

Third Line 
A=30 
B=40 

Пожалуйста, помогите мне в решении этой проблемы.

+1

Это правда, но это повод downvote свой вопрос? Я нахожу это совершенно верным. Кроме того, если вы держите его вниз, он теряет право на победу, и мы не хотим этого, не так ли? :) –

ответ

2
import re 
a = ["A:30 B: 40 TS:1/1/1990 22:22:22", "A:30 TS:1/1/1990 22:22:22", "A:30 B: 40"] 
regex = re.compile(r"^\s*(?:(A)\s*:\s*(\d+))?\s*(?:(B)\s*:\s*(\d+))?\s*(?:(TS)\s*:\s*(.*))?$") 
for item in a: 
    matches = regex.search(item).groups() 
    print {k:v for k,v in zip(matches[::2], matches[1::2]) if k} 

выведет

{'A': '30', 'B': '40', 'TS': '1/1/1990 22:22:22'} 
{'A': '30', 'TS': '1/1/1990 22:22:22'} 
{'A': '30', 'B': '40'} 

Объяснение регулярное выражение:

^\s*  # match start of string, optional whitespace 
(?:  # match the following (optionally, see below) 
(A)  # identifier A --> backreference 1 
\s*:\s* # optional whitespace, :, optional whitespace 
(\d+) # any number --> backreference 2 
)?  # end of optional group 
\s*  # optional whitespace 
(?:(B)\s*:\s*(\d+))?\s* # same with identifier B and number --> backrefs 3 and 4 
(?:(TS)\s*:\s*(.*))?  # same with id. TS and anything that follows --> 5 and 6 
$   # end of string 
+0

спасибо за помощь, она решила мою проблему – james

+0

в продолжении выше темы, у меня есть строка ниже | | | A: 720897 | N ° 227: AT CIRCLE, и я использовал regex = re.compile (r "\ s * (? :(Link Id) \ s *: \ s * (\ d +)) \ s * | \ s * (?: (N ° (\ d +)) \ s *: \ s * (. *)) $ "), Но он не дает желаемого результата .pls, дайте мне знать, где я ошибаюсь. Я использовал # - * - кодирование: iso -8859-1 - * - – james

+0

@james: форматирование кода затруднено в комментариях; вы могли бы отредактировать свой ответ и отформатировать свои новые примеры в качестве кода, чтобы я мог лучше видеть, где может быть проблема? Благодарю. –

1

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

import re 

def parseInput(input): 
    m = re.match(r"A:\s*(\d+)\s*B:\s*(\d+)\s*TS:(.+)", input) 
    return {"A": m.group(1), "B": m.group(2), "TS": m.group(3)} 

print parseInput("A:30 B: 40 TS:1/1/1990 22:22:22") 

Это печатает {'A': '30', 'B': '40', 'TS': '1/1/1990 22:22:22'} Что только словарь, содержащий значения.

P.S. Вы должны принять некоторые ответы и ознакомиться с этикеткой сайта, и люди будут более охотно готовы помочь вам.

Смежные вопросы