2015-10-20 14 views
6

Sono un principiante quindi per favore perdonami per quella domanda. Vorrei programma di scrittura che ingrandisce le lettere tra i caratteri "<" and ">"Python come scansionare la stringa e usare upper() tra due caratteri?

Per esempio ingresso:

<html> randomchars </html> 

uscita:?

<HTML> randomchars </HTML> 

come fare

Ho solo scritto questo ma questa rivista annulla tutte le parole.

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

Grazie per l'aiuto.

+0

Avete davvero provato * questo * codice? Per me, non fa nulla al testo. Ricorda, inp è la * intera * stringa.Se si inserisce qualcosa tranne un singolo segno di meno che, stampa semplicemente l'output. – Prune

+1

Che dire di '>'? Le espressioni regolari non sono una buona scelta per analizzare HTML. Oltre a sapere quando sfuggire ai personaggi, c'è il problema dei tag nidificati che porteranno a mal di testa annidati. Si prega di utilizzare uno strumento adatto come beautifulsoup per questo: http://www.crummy.com/software/BeautifulSoup/bs4/doc/ –

+0

Si prega di chiarire il problema. Se è semplice come dichiari (forse parte di un compito a casa), la mia risposta potrebbe funzionare per te. Se stai tentando di attaccare la sintassi HTML completa, la soluzione è probabilmente disponibile come pacchetto open source e oltre le tue attuali risorse di programmazione personale. – Prune

risposta

0

In primo luogo, cerchiamo di "riparazione" il ciclo while per ottenere il controllo prosecuzione fuori strada. Invece di

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

uso

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

Ora, per le interiora di loop. Dobbiamo elaborare "inp" per inserire i caratteri marcati in maiuscolo. Vogliamo anche farlo in un modo che un principiante possa capire, facendo corrispondere il flusso del ciclo originale.

È necessario scorrere i caratteri nella stringa di input. Imposta una bandiera booleana per dirti se ti trovi o meno in un'area contrassegnata.

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

Grazie amico! Brillant! – Rarez

+0

In realtà, è 'brillante' solo che risolve il tuo problema al tuo attuale livello di abilità. Come apprenderai presto, ci sono * molti * modi migliori per farlo in Python. Tra le altre cose, è molto meglio trovare il prossimo '<' e semplicemente concatenare tutte le cose davanti a quelle come una stringa, invece di un personaggio alla volta. Ho provato a seguire la sensazione del * tuo * codice. – Prune

+0

Il tuo primo suggerimento su come spostare la condizione e raddoppiare l'input non è un miglioramento. – Ryan

0

Si desidera utilizzare un'espressione regolare per abbinare i tag e passare una funzione per modificare la corrispondenza. Vedere questa risposta precedente: 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

Lui sicuramente ** non ** vuole usare le espressioni regolari per analizzare html. –

+0

Ancora meglio, OP vuole un parser HTML ... – mgilson

+0

Non ha detto nulla sull'analisi dell'HTML. Vuole solo convertire i caratteri in maiuscolo. – coder123

2

Prova re.sub;

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

/?\w+ ripartizione qui di seguito, supponendo che si può vedere parentesi () rende il gruppo e stiamo cercando di abbinare tra parentesi <>;

  • ? corrisponderà avidamente a 0 o 1 ripetizioni del precedente RE. Pertanto, /? corrisponderà sia ai tag iniziali che a quelli finali.
  • \w corrisponderà a qualsiasi carattere di parola Unicode, inclusi a-z, A-Z e 0-9.
  • + corrisponderà avidamente a 1 o più ripetizioni dell'ER precedente.

Questo corrisponderà alla maggior parte dei tag e quindi è possibile sostituire il tag dopo la conversione in maiuscolo in linea utilizzando la funzione lambda, up.

+1

'<([A-Z])\1>'? Che cosa? Questo sostituirà '' con 'XX', dove' X' è una qualsiasi * lettera maiuscola *. – Ryan

+0

@minitech, vedere di nuovo per favore, modificato la mia risposta. – mass

Problemi correlati