Разбор строк в питоне - PullRequest
       26

Разбор строк в питоне

5 голосов
/ 03 февраля 2011

Итак, моя проблема в том, что у меня есть файл, который выглядит следующим образом:

[SHIFT]this isrd[BACKSPACE][BACKSPACE] an example file[SHIFT]1

Это, конечно, будет означать

' This is an example file!'

Я ищу способ разбораисходный контент в конечный контент, так что [BACKSPACE] удалит последний символ (включая пробелы), а несколько символов возврата будут удалены несколько символов.[SHIFT] не имеет большого значения для меня.Спасибо за помощь!

Ответы [ 5 ]

1 голос
/ 03 февраля 2011

Это именно то, что вы хотите:

def shift(s):
    LOWER = '`1234567890-=[];\'\,./'
    UPPER = '~!@#$%^&*()_+{}:"|<>?'

    if s.isalpha():
        return s.upper()
    else:
        return UPPER[LOWER.index(s)]

def parse(input):
    input = input.split("[BACKSPACE]")
    answer = ''
    i = 0
    while i<len(input):
        s = input[i]
        if not s:
            pass
        elif i+1<len(input) and not input[i+1]:
            s = s[:-1]
        else:
            answer += s
            i += 1
            continue
        answer += s[:-1]
        i += 1

    return ''.join(shift(i[0])+i[1:] for i in answer.split("[SHIFT]") if i)

>>> print parse("[SHIFT]this isrd[BACKSPACE][BACKSPACE] an example file[SHIFT]1")
>>> This is an example file!
1 голос
/ 03 февраля 2011

Вот один из способов, но он кажется хакерским. Возможно, есть лучший способ.

def process_backspaces(input, token='[BACKSPACE]'):
    """Delete character before an occurence of "token" in a string."""
    output = ''
    for item in (input+' ').split(token):
        output += item
        output = output[:-1]
    return output

def process_shifts(input, token='[SHIFT]'):
    """Replace characters after an occurence of "token" with their uppecase 
    equivalent. (Doesn't turn "1" into "!" or "2" into "@", however!)."""
    output = ''
    for item in (' '+input).split(token):
        output += item[0].upper() + item[1:]
    return output

test_string = '[SHIFT]this isrd[BACKSPACE][BACKSPACE] an example file[SHIFT]1'
print process_backspaces(process_shifts(test_string))
1 голос
/ 03 февраля 2011

Если вам не нужны сдвиги, просто снимите их, загрузите

(defun apply-bspace ()
  (interactive)
  (let ((result (search-forward "[BACKSPACE]")))
    (backward-delete-char 12)
    (when result (apply-bspace))))

и нажмите M-x apply-bspace при просмотре файла. Это Elisp, а не python, но он соответствует вашему начальному требованию " что-то, что я могу бесплатно загрузить на ПК ".

Edit: Shift сложнее, если вы хотите применить его и к числам (так что [SHIFT]2 => @, [SHIFT]3 => # и т. Д.) Наивный способ работы с буквами:

(defun apply-shift ()
  (interactive)
  (let ((result (search-forward "[SHIFT]")))
    (backward-delete-char 7)
    (upcase-region (point) (+ 1 (point)))
    (when result (apply-shift))))
0 голосов
/ 03 февраля 2011

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

Вот как я бы это сделал:

# -*- coding: utf-8 -*-

import re

upper_value = {
    1: '!', 2:'"',
}

tokenizer = re.compile(r'(\[.*?\]|.)')
origin = "[SHIFT]this isrd[BACKSPACE][BACKSPACE] an example file[SHIFT]1"
result = ""

shift = False

for token in tokenizer.findall(origin):
    if not token.startswith("["):
        if(shift):
            shift = False
            try:
                token = upper_value[int(token)]
            except ValueError:
                token = token.upper()

        result = result + token
    else:
        if(token == "[SHIFT]"):
            shift = True
        elif(token == "[BACKSPACE]"):
            result = result[0:-1]

Это несамое быстрое, но не элегантное решение, но я думаю, что это хорошее начало.

Надеюсь, это поможет: -)

0 голосов
/ 03 февраля 2011

Кажется, что вы можете использовать регулярное выражение для поиска (чего-то) [BACKSPACE] и заменить его ничем ...

re.sub('.?\[BACKSPACE\]', '', YourString.replace('[SHIFT]', ''))

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

...