2015-10-20 67 views
6

我是初學者,所以請原諒我這個問題。我想這角色<" and ">"Python如何掃描字符串並在兩個字符之間使用upper()?

之間的「放大字母例如 輸入寫程序:

<html> randomchars </html> 

輸出

<HTML> randomchars </HTML> 

如何做到這一點

我只寫了這個,但這個mag說出所有的話。

while True:    
    inp = input() 
    if inp == "": 
     break 
    elif inp =="<": 
     inp=inp.upper() 
     print(inp) 
    else: 
     print(inp) 

感謝您的幫助。

+0

你真的試過*這個*代碼嗎?對我而言,它對文本沒有任何影響。請記住,inp是*整個*字符串。如果輸入任何內容,但只輸入一個小於號,則只會輸出輸出。 – Prune

+1

'>''?正則表達式不是解析HTML的好選擇。除了知道何時轉義角色,還有嵌套標籤的問題會導致嵌套頭痛。請使用像美麗的合適的工具:http://www.crummy.com/software/BeautifulSoup/bs4/doc/ –

+0

請澄清你的問題。如果它很簡單(可能是家庭作業的一部分),我的答案可能適用於您。如果您試圖攻擊完整的HTML語法,那麼該解決方案可能作爲開源軟件包提供 - 並且超出您目前的個人編程資源。 – Prune

回答

0

首先,讓我們來「修復」 while循環得到延續控制的方式進行。取而代之的

while True: 
    inp = input() 
    if inp == "": 
     break 
    <process the input> 

使用

inp = input() 
while inp != "": 
    <process the input> 
    inp = input() 

現在,對於循環內臟。我們需要處理「inp」將標記的字符轉換爲大寫。我們也希望以初學者可以理解的方式做到這一點,與原始循環流程相匹配。

您需要迭代輸入字符串中的字符。設置一個布爾標誌來告訴你你是否在標記區域。

upper_area = False 
    out_str = "" 
    for char in inp: 
     if char == '>': 
      upper_area = False 
     elif char == '<': 
      upper_area = True 
     elif upper_area: 
      char = char.upper() 
     out_str += char 
+0

謝謝隊友!高明! – Rarez

+0

實際上,它只有在您目前的技能水平上解決您的問題纔是「非凡的」。正如你很快就會學到的,在Python中有很多更好的方法來實現這一點。除此之外,找到下一個'<'會更好,並且將它前面的所有內容簡單地連接成一個字符串,而不是一次一個字符。我試圖堅持*你的*代碼的感覺。 – Prune

+0

關於移動條件和雙倍輸入的第一個建議不是一個改進。 – Ryan

0

你想使用正則表達式來匹配標籤,並傳遞一個函數來修改匹配。看到這個以前的答案: Making letters uppercase using re.sub in python?

def upper_repl(match): 
    return match.group(1).upper() 

re.sub('(<[^>]*>)', upper_repl, '<span> <hey <annoy!>> </span>') 
'<SPAN> <HEY <ANNOY!>> </SPAN>' 
+4

他肯定沒有**不想**使用正則表達式來解析html。 –

+0

更棒的是,OP想要一個HTML解析器...... – mgilson

+0

他沒有提到解析HTML的任何信息。他只是想將字符轉換爲大寫。 – coder123

2

嘗試re.sub;

print re.sub(r"(</?\w+>)", lambda up: up.group(1).upper(), "<tag>input</tag>") 

/?\w+低於擊穿,假設你可以看到括號()使得集團,我們正在努力括號<>之間的匹配;

  • ?將貪婪地匹配前面的RE的0或1個重複。 因此,/?將匹配開始和結束標籤。
  • \w將匹配任何Unicode單詞字符,包括a-z,A-Z和0-9。
  • +將貪婪地匹配前面的RE的一個或多個重複。

這將匹配大多數標籤,然後您可以在使用lambda函數up轉換爲大寫內聯之後替換標籤。

+1

'<([A-Z])\1>'?什麼?這將用'XX'代替'',其中'X'是任何*已經是大寫*的字母。 – Ryan

+0

@minitech,請再看一遍,編輯我的答案。 – mass