2011-03-16 33 views
6

Python新手,能夠使用少數幾種語言,但無法看到如下的「時髦」方式。我確信它正在尖叫出一個正則表達式,但是我能想出的任何解決方案(使用正則表達式組和不能)很快就會變得瘋狂。如何替換字符串中的令牌對?

所以,我有一個字符串與類似html的標記,我想用實際的html標記替換。

例如:

Hello, my name is /bJane/b. 

應該改爲:

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

它可能與[I] talic和[u] nderline以及被combo'd:

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

應該變成:

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

很顯然,直str.replace將不起作用,因爲每個第2個標記都需要以前斜線作爲前綴。

爲了清楚起見,如果令牌正在組合,它總是先打開,先關閉。

非常感謝! PS:在任何人感到興奮之前,我知道這種事應該用CSS,blah,blah,blah來完成,但是我沒有寫軟件,我只是逆轉它的輸出!

+6

如果這應該是HTML那麼它是無效的,因爲你的元素重疊。我認爲你的意思是''但這可能會更難做到正確。 – 2011-03-16 20:47:49

+0

我知道這不是有效的HTML,但沒關係。我只是在尋找一個快速而骯髒的應用程序輸出的解析器(python的新特性,所以我想給它一個鏡頭)。解析的結果只在內部用於筆記。 – Bridgey 2011-03-16 20:51:20

+0

「......只在房子裏用於筆記」 - 我們可以讓你知道嗎? :) – 2011-03-16 20:56:37

回答

7

也許這樣的事情可以幫助:

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

太棒了,非常感謝!這似乎是一種享受! – Bridgey 2011-03-16 21:18:43

+0

@Bridgey:很高興幫助:) – mouad 2011-03-16 21:21:56

0

與SED:

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

只寫是對的。去正則表達式。 – nmichaels 2011-03-16 20:51:38

+0

自從他提到python以來,似乎對sed解決方案沒有幫助。 – 2011-03-16 20:55:36

+0

謝謝你們。請原諒我的python/sed無知,但是我知道sed是一個linux/unix命令,不是Python的一部分。鑑於我希望Python腳本能夠在Windows上運行,這是否會工作? – Bridgey 2011-03-16 21:07:16

0

一個非常簡單的解決辦法是使用源標籤「/ B」分割字符串,並重新加入陣列像這樣的新目的地標籤'子的:

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

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

您在結束標記中缺少'/'。 – Johnsyweb 2011-03-17 20:45:20