2011-02-03 18 views
5
だから私の問題がある

これ、私はこのようなファイルがあります:解析文字列

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

これは、もちろん、私が解析する方法を探しています

' This is an example file!' 

に変換でしょうが[BACKSPACE]は最後の文字(スペースを含む)を削除し、複数のバックスペースは複数の文字を削除します。 [SHIFT]は本当に重要なことではありません。すべての助けをありがとう!

+0

は、[Backspace]キーと[SHIFT]あなたが心配する必要がある唯一のマークアップはありますか? – inspectorG4dget

答えて

1

これは片方向ですが、ハック感があります。おそらくもっと良い方法があります。あなたのファイルを見ながら

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)) 
+0

ありがとう!これはよさそうだ! –

0

「複数の文字を削除する複数のスペース」あなたがで何を意味するのかわからない

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

...あなたは[BACKSPACE](何か)を検索するための正規表現を使用して、何でそれを置き換えることができているようです。

+1

-1「blah [BACKSPACE] [BACKSPACE] [BACKSPACE] arf」ではどのように動作しますか? – payne

+0

これは 'barf'を返します。 –

+0

しかし、バックスペースとバックスペースの前に1つのスペースを削除する必要があります。 '[BACKSPACE]' itslef –

1

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

あなたがちょうどそれらを取り除く、シフトを気にしない場合は、負荷とはM-x apply-bspaceを打ちます。それはPythonではなくElispですが、最初の必要条件は「something I can download for free to a PC」です。

編集:Shiftキーは数字にも適用したいので(​​=>@[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

+1 Elispの答え!私は個人的にはvimの人ですが、このようなものは時々私をemacsの方に引っ張ります。 –

+0

@Joe Kington - Hehe。真実であるためには、これは、キーボードマクロと多分、別名、大文字の解析が必要な大規模なファイルがなければ、多分私が扱うはずのものです。関数が分かりやすく説明するのが簡単なことです。 – Inaimathi

0

です。

これは、私はそれを行うだろうかです:

# -*- 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] 

それは最速、どちらもエレガントな解決策ではないのですが、私はそれは良いスタートだと思います。

これは正確に何をしたいんそれは:-)

1

を役に立てば幸い:

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

    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! 
+0

おっと、私はちょうどバグを発見しました...ごめんなさい。 – inspectorG4dget

+0

デバッグが完了し、結果はまさにあなたが望むものです – inspectorG4dget