2011-03-16 15 views
6

Python'da yeni, birkaç dilde yetkin, ancak aşağıdakileri yapmanın 'snazzy' yolunu göremiyorum. Eminim bir regex için çığlık atıyordur, ama gelebileceğim herhangi bir çözüm (regex grupları ve neyin kullanılmadığı) oldukça çabuk çıldırır.Bir dizede jeton çifti nasıl değiştirilir?

Yani, gerçek html etiketleri ile değiştirmek istediğiniz html benzeri etiketlere sahip bir dizilim var. Örneğin

:

Hello, my name is /bJane/b. 

gibi olmalı:

Hello, my name is <b>Jane</b>. 

O [u] nderline yanı [i] Talic ile combo'd olabilir:

/iHello/i, my /uname/u is /b/i/uJane/b/i/u. 

Olması gereken:

<i>Hello</i>, my <u>name</u> is <b><i><u>Jane</b></i></u>. 

Açıkçası düz bir str.replace işe yaramayacaktır çünkü her 2. jetonun öne eğik çizgiyle yan yana olması gerekir.

Açıklık sağlamak için, jetonlar birleştiriliyorsa, her zaman ilk önce açılır, her zaman kapanır.

Çok teşekkürler!

PS: kimse heyecanlanıyor önce, şey bu tür CSS vesaire, vesaire, vesaire ile yapılması gerektiğini biliyorum ama, ben sadece onun çıkışını tersine ediyorum yazılımı yazmadım! sed ile

+6

sizin unsurlardır çünkü o zaman geçersiz olduğunu örtüşen. Demek istediğim, ' Jane 'dür, ancak bu doğru bir şekilde yapılması zor olabilir. –

+0

Geçerli bir HTML olmadığını biliyorum, ancak bu önemli değil. Sadece bir app çıktı için hızlı ve kirli bir ayrıştırıcı arıyordum (python yeni bir atış bu yüzden bir atış verdim). Ayrıştırmanın sonucu sadece notlar için evde kullanılıyor. – Bridgey

+0

"... sadece notlar için evde kullanılıyor" - sizi bununla meşgul edebilir miyiz? :) –

cevap

7

Belki böyle bir şey yardımcı olabilir:

import re 


def text2html(text): 
    """ Convert a text in a certain format to html. 

    Examples: 
    >>> text2html('Hello, my name is /bJane/b') 
    'Hello, my name is <b>Jane</b>' 
    >>> text2html('/iHello/i, my /uname/u is /b/i/uJane/u/i/b') 
    '<i>Hello</i>, my <u>name</u> is <b><i><u>Jane</u></i></b>' 

    """ 

    elem = [] 

    def to_tag(match_obj): 
     match = match_obj.group(0) 
     if match in elem: 
      elem.pop(elem.index(match)) 
      return "</{0}>".format(match[1]) 
     else: 
      elem.append(match) 
      return "<{0}>".format(match[1]) 

    return re.sub(r'/.', to_tag, text) 

if __name__ == "__main__": 
    import doctest 
    doctest.testmod() 
+0

Awesome, çok teşekkürler! Bu bir tedavi çalışması gibi görünüyor! – Bridgey

+0

@Bridgey: Yardım ettiğine sevindim :) – mouad

0

:

s/\/([biu])([^/]\+)\/\1/<\1>\2<\/\1>/g 
+0

Yazma sadece doğrudur. Normal ifadelere git. – nmichaels

+0

python'dan bahsettiğinden beri, bir sed çözeltisiyle yardımcı görünmüyor. –

+0

Teşekkürler çocuklar. Python/sed cehaletimi affedin, ama bir linux/unix komutu olarak sed'i biliyorum, pythonun bir parçası değil. Python betiğinin Windows'da da çalışabilmesini sağlamak istediğim için bu işe yarayacak mı? – Bridgey

0

Çok basit bir çözüm kaynağı etiketi '/ b' kullanarak dize bölmek olacağını ve diziyi yeniden katılmak böyle yeni hedef etiketine '' ile altdizgenin: HTML olması gerekiyor ise

s = "Hello, my name is /bJane/b." 
'<b>'.join(s.split('/b')) 
print s 

'Hello, my name is <b>Jane<b>.' 
+0

Kapatma etiketinde '/' eksik. – Johnsyweb

İlgili konular