2016-10-12 4 views
1

У меня есть строка, которая выглядит следующим образом:Matching несколько шаблонов в строке

s = "[A] text [B] more text [C] something ... [A] hello" 

в основном она состоит [X] chars, и я пытаюсь получить текст «после» каждой [X].

Я хотел бы дать эту Dict (я не заботиться о порядке):

mydict = {"A":"text, hello", "B":"more text", "C":"something"} 

Я думал о регулярном выражении, но я не был уверен, что это правильный выбор, потому что в моем случае порядок [A], [B] и [C] может измениться, так что эта строка действительна также:

s = "[A] hello, [C] text [A] more text [B] something" 

Я не знаю, как правильно извлечь строку. Может ли кто-нибудь указать мне правильное направление? Благодарю.

+0

вы правы. Прости. Ред. – Chris

+0

Вы пытались использовать re.findall, чтобы найти все «[X] символы» в вашей строке ввода, а затем использовать re.match для извлечения X и символов? –

ответ

3

Не уверен, если это совсем то, что вы ищете, но он терпит неудачу с дубликатами

s = "[A] hello, [C] text [A] more text [B] something" 

results = [text.strip() for text in re.split('\[.\]', s) if text] 

letters = re.findall('\[(.)\]', s) 

dict(zip(letters, results)) 

{'A': 'more text', 'B': 'something', 'C': 'text'} 

Поскольку вывод выглядит следующим образом:

In [49]: results 
Out[49]: ['hello,', 'text', 'more text', 'something'] 

In [50]: letters 
Out[50]: ['A', 'C', 'A', 'B'] 

Для решения дубликатов вы могли бы сделать что-то вроде ....

mappings = {} 

for pos, letter in enumerate(letters): 
    try: 
     mappings[letter] += ' ' + results[pos] 
    except KeyError: 
     mappings[letter] = results[pos] 

, который дает: {'A': 'hello, more text', 'B': 'something', 'C': 'text'}

UPDATE

Или еще лучше вы могли бы посмотреть на использование по умолчанию: как показано здесь: enter link description here

+0

Я обновил, так как заметил, что OP хочет присоединиться к значениям dup в своем dict. –

+0

Это хорошо. Что, если строка будет 's =" произвольным текстом [A] abc [B] fff [C] ... "" Тогда будет также извлечен «произвольный текст». Как избавиться от него? Другое дело: что, если '[X]' is '[CAR]' или '[CAR]' (я хочу удалить пробелы после/до) – Chris

+0

Получение '[X]' и '[CAR]' является вопросом изменение '' \ [(.) \] '' '' \ [(\ w) \] ''для соответствия словам. Если вы хотите избавиться от ведущих результатов, вы можете просто обмануть и сравнить «len (results)» и «len (letters)», затем поп-элементы соответственно –

1

Ожидаемый результат: mydict = {"A":"text, hello", "B":"more text", "C":"something"}

import re 

s = "[A] text [B] more text [C] something ... [A] hello" 

pattern = r'\[([A-Z])\]([ a-z]+)' 

items = re.findall(pattern, s) 

output_dict = {} 

for x in items: 
    if x[0] in output_dict: 
     output_dict[x[0]] = output_dict[x[0]] + ', ' + x[1].strip() 
    else: 
     output_dict[x[0]] = x[1].strip() 

print(output_dict) 

>>> {'A': 'text, hello', 'B': 'more text', 'C': 'something'}

0

Вот простое решение:

#!/usr/bin/python 

import re 
s = "[A] text [B] more text [C] something ... [A] hello" 
d = dict() 
for x in re.findall(r"\[[^\]+]\][^\[]*",s): 
    m = re.match(r"\[([^\]*])\](.*)",x) 

    if not d.get(m.group(1),0): 
     #Key doesn't already exist 
     d[m.group(1)] = m.group(2) 
    else: 
     d[m.group(1)] = "%s, %s" % (d[m.group(1)], m.group(2)) 

print d 

Печать:

{'A': ' text , hello', 'C': ' something ... ', 'B': ' more text '} 
Смежные вопросы