Ich möchte die Eingaben des Benutzers in einen Textbereich auf einer HTML-Seite in eine Ausgabe mit <p> - Tags umwandeln, in der jede <p> neue Zeilen ersetzt.

Ich versuche es mit regulären Ausdrücken, aber ich kann es nicht zum Laufen bringen. Wird jemand meinen Ausdruck korrigieren?

String = "Hey, this is paragraph 1 \n and this is paragraph 2 \n and this will be paragraph 3"
Regex = r'(.+?)$'

Es ergibt sich nur Hey, this is paragraph 1 \n and this is paragraph 2 \n<p>and this will be paragraph 3</p>

1
mrmclovin 7 Okt. 2012 im 00:44

5 Antworten

Beste Antwort

Ich würde dafür keine regulären Ausdrücke verwenden, einfach weil Sie es nicht brauchen. Überprüfen Sie dies heraus:

text = "Hey, this is paragraph 1 \n and this is paragraph 2 \n and this will be paragraph 3"
html = ''
for line in text.split('\n'):
   html += '<p>' + line + '</p>'

print html

Um es eine Zeile zu machen, weil kürzer besser und klarer ist:

html = ''.join('<p>'+L+'</p>' for L in text.split('\n'))
2
jadkik94 6 Okt. 2012 im 20:50

Die obigen Antworten, die auf der Identifizierung von '\ n' beruhen, funktionieren nicht zuverlässig. Sie müssen .splitlines() verwenden. Ich habe nicht genug Repräsentanten, um die gewählte Antwort zu kommentieren, und als ich das Wiki bearbeitet habe, hat es jemand einfach zurückgesetzt. Kann jemand mit mehr Vertretern das Problem beheben?

Text aus einem textarea kann '\ r \ n' als neues Zeilenzeichen verwenden.

>> "1\r\n2".split('\n') 
['1\r', '2']

'\ r' allein ist innerhalb einer Webseite ungültig, daher führt die Verwendung einer der oben genannten Lösungen zu schlecht geformten Webseiten.

Glücklicherweise bietet Python eine Funktion, um dies zu lösen. Die Antwort, die zuverlässig funktioniert, lautet:

html = ''.join('<p>'+L+'</p>' for L in text.splitlines())
1
Richard 19 Juni 2014 im 10:25

Ziemlich einfach >>

html='<p>'+s.replace("\n",'</p><p>')+'</p>'
0
Ωmega 7 Okt. 2012 im 00:16

Sie müssen den Anker $ entfernen. Ihre Regex versucht, einem oder mehreren Nicht-Zeilenumbruchszeichen zuzuordnen, gefolgt vom Ende der Zeichenfolge . Sie können den MULTILINE-Modus verwenden, um die Anker an den Liniengrenzen wie folgt anzupassen:

s1 = re.sub(r'(?m)^.+$', r'<p>\g<0></p>', s0)

... aber das funktioniert genauso gut:

s1 = re.sub(r'.+', r'<p>\g<0></p>', s0)

Der widerstrebende Quantifizierer (.+?) hat auch nichts Nützliches getan, aber er hat die Ausgabe nicht so durcheinander gebracht wie der Anker.

0
Alan Moore 6 Okt. 2012 im 23:39

Ich würde es so machen:

s = "Hey, this is paragraph 1 \n and this is paragraph 2 \n and this will be paragraph 3"
"".join("<p>{0}</p>".format(row) for row in s.split('\n'))

Sie teilen Ihre Zeichenfolge im Grunde in eine Liste von Zeilen auf. Umschließen Sie dann jede Zeile mit Absatz-Tags. Am Ende verbinden Sie einfach Ihre Linien.

1
pbetkier 6 Okt. 2012 im 21:02