Seite 1 von 1

Buchstabe aus String löschen...

Verfasst: Dienstag 18. Dezember 2007, 19:27
von breize
Hallo zusammen,
ich habe eine kleine Frage bezüglich Strings. Mit "string.lstrip()" ist es ja mögloch ein Zeichen aus einem String zu entfernen, was mache ich aber wenn mir egal ist welches Zeichen entfernt wird, wenn ich also einfach das erste Zeichen des Strings löschen will?

Besten Dank im Vorraus

Breise

Verfasst: Dienstag 18. Dezember 2007, 19:46
von BlackJack
Direkt aus der Zeichenkette etwas entfernen kann man nicht, weil Zeichenketten in Python nicht verändert werden können. Du kannst aber eine neue Zeichenkette ohne das erste Zeichen durch "slicing" bekommen:

Code: Alles auswählen

In [35]: 'hallo'[1:]
Out[35]: 'allo'

Verfasst: Dienstag 18. Dezember 2007, 19:59
von breize
Das ist aber doch für eine Scriptsprache relativ erbärmlich, und außerdem nicht gut automatisierbar.

Mein Problem ist, dass ich einen String solange bearbeiten möchte bis er eine Regex matcht.

Meine Momentane Idee ist, es so

Code: Alles auswählen

from re import *

re_forDeletingBeforeLink = compile('^http://.*')
line='datenmülldatenoasdasdasdhttp://images.del.icio.us/static/img/delicious.small.gif" width="10" height="10" alt="" /> <a href="http://del.icio.us/">del.icio.us</a></li><li><a href="http://del.icio.us/about">about</a></li><li><a href="http://blog.del.icio.us/">blog</a></li><li><a href="http://del.icio.us/help/terms">terms of service</a></li><li><a href="http://del.icio.us/help/privacy">privacy policy</a></li><li><a href="http://del.icio.us/help/copyright">copyright policy</a></li><li><a href="http://del.icio.us/help/support">support</a></li><li><a class="rss" href="/rss/" title="RSS"><img src="http://images.del.icio.us/static/img/rss.gif" width="36" height="14" alt="RSS" /></a> feed for this page</li></ul>'

while line.count > 0:
    line2 = line[1:]
    line = line2
    if re_forDeletingBeforeLink.match(line):
        print('Regular Expression matched!')
        print(line)
        break
zu machen, vielleicht fällt ja jemandem noch eine elegantere Idee ein...

Verfasst: Dienstag 18. Dezember 2007, 20:08
von Trundle
Einfach gleich

Code: Alles auswählen

line = line[1:]
Und deine Schleifenbedingung ist glaube ich eine etwas andere, als du vielleicht denkst.

Verfasst: Dienstag 18. Dezember 2007, 20:18
von Hobbes Hobson

Code: Alles auswählen

import re

re_forDeletingBeforeLink = re.compile('^http://.*')

line='datenmüll'

while len(line) > 0:
    line = line[1:]
    if re_forDeletingBeforeLink.match(line):
        print('Regular Expression matched!')
        print(line)
        break
Sternchenimport habe ich mal rausgenomme und .count mit der Funktion len ersetzt. (count(arg) zählt ein Zeichen)


Mal eine ganz andere Frage: Was soll das Programm denn überhaupt machen?

Verfasst: Dienstag 18. Dezember 2007, 20:50
von Hyperion
Will hier kein Thread-Hijacking betreiben, aber mir fiel hier grad was auf:
Wieso folgender Code?

Code: Alles auswählen

print("Hallo")
anstelle von

Code: Alles auswählen

print "Hallo"
Ist aus vorgreifender "Kompatibilität" zu Python3000? (Also damit das später automatisch als Funktion aufgesasst wird und leichter anpassbar ist?)
Ist ein "Hallo" nur eine verkürzte Schreibweise für die Sequenz ("Hallo")?

Verfasst: Dienstag 18. Dezember 2007, 20:50
von BlackJack
@breize: Ich sehe jetzt nicht was daran "erbärmlich" ist? Und was hat das mit Skriptsprachen zu tun? In Java sind Zeichenketten auch nicht veränderbar.

Das Beispiel sieht zu umständlich aus. Warum suchst Du nicht einfach mit dem regulären Ausdruck ohne das '^' am Anfang!?

Verfasst: Dienstag 18. Dezember 2007, 20:57
von breize
Hyperion hat geschrieben:Will hier kein Thread-Hijacking betreiben, aber mir fiel hier grad was auf:
Wieso folgender Code?

Code: Alles auswählen

print("Hallo")
anstelle von

Code: Alles auswählen

print "Hallo"
Ist aus vorgreifender "Kompatibilität" zu Python3000? (Also damit das später automatisch als Funktion aufgesasst wird und leichter anpassbar ist?)
Ist ein "Hallo" nur eine verkürzte Schreibweise für die Sequenz ("Hallo")?
Threadhijacking ist immer willkommen :D

Ich finde das ganze einfach sauberer. Print ist auch eine Funktion, wieso sollte ich das dann nicht der Übersichtlichkeit halber als Funktion schreiben, wenn das ganze dann auchnoch vorausgreifender Kompatibilität dient und ich es damit auch legitimieren kann ist mir das nur recht ;)

@BlackJack

Mein Kommentar bezog sich eigentlich darauf das Skriptsprachen ja oft genutzt werden um Strings zu manipulieren (siehe Perl).

Den Regex habe ich so gebaut weil ich alles vor "http" weghaben möchte und genau dann der Regex greifen soll.
Falls du eine bessere Lösung mit einer anderen Regex hast, teile Sie mit bitte mit :wink:

Verfasst: Dienstag 18. Dezember 2007, 21:12
von Python 47
breize hat geschrieben: Mein Kommentar bezog sich eigentlich darauf das Skriptsprachen ja oft genutzt werden um Strings zu manipulieren (siehe Perl).
Seit wann das denn?

Verfasst: Dienstag 18. Dezember 2007, 21:14
von breize
Aus der Wikipedia
Zu Beginn war Perl ein UNIX-Werkzeug, das besonders auf die Verarbeitung von Textdateien, Steuerung anderer Programme sowie zur Ausgabe von Berichten ausgelegt war.
Außerdem möchte ich folgende weitere Frage anschließen, wieso funktioniert folgende logische operation nicht "print listevonzahlen[:listevonzahlen.count - 1]"?

Die brauche ich nämlich wenn ich das oben beschriebene nochmal rückwärts für den String machen möchte...

Verfasst: Dienstag 18. Dezember 2007, 21:15
von Hobbes Hobson
Was ist denn dein Gesamtproblem?

Du möchtest einen Link aus einem String herauslesen? Oder einfach nur alles vor dem ersten http:// löschen?


--------


Zu deiner Frage: .count wird erstmal mit () aufgerufen und dient dazu ein bestimmtes Zeichen in einem String zu zählen.

Verfasst: Dienstag 18. Dezember 2007, 21:18
von breize
Ja genau, ich will einfach nur den Link haben

Verfasst: Dienstag 18. Dezember 2007, 21:23
von Darii
breize hat geschrieben:Mein Kommentar bezog sich eigentlich darauf das Skriptsprachen ja oft genutzt werden um Strings zu manipulieren (siehe Perl).
Nur weil man eine Sprache als Scriptsprache einsetzen kann, heißt das noch lange nicht, dass man damit toll Strings manipulieren kann oder gar, dass sie ein Perl-Klon ist. AppleScript wurde dazu bestimmt nicht geschaffen.
"print listevonzahlen[:listevonzahlen.count - 1]"?
Weil listevonzahlen.count eine Funktion und keine Eigenschaft ist die du zudem noch völlig falsch benutzten willst. Siehe Hobbes ersten Post. Eigentlich müsste dein Code jede Menge hilfreiche Exceptions werfen.

Versuchs mal mit

Code: Alles auswählen

print listevonzahlen[:len(listevonzahlen)-1]

Verfasst: Dienstag 18. Dezember 2007, 21:27
von Hobbes Hobson

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding:  iso-8859-15 -*-

import re

ausdr = re.compile('(http://.*?)[\s|"]')

line='datenmülldatenoasdasdasdhttp://images.del.icio.us/static/img/delicious.small.gif" width="10" height="10" alt="" /> <a href="http://del.icio.us/">del.icio.us</a></li><li><a href="http://del.icio.us/about">about</a></li><li><a href="http://blog.del.icio.us/">blog</a></li><li><a href="http://del.icio.us/help/terms">terms of service</a></li><li><a href="http://del.icio.us/help/privacy">privacy policy</a></li><li><a href="http://del.icio.us/help/copyright">copyright policy</a></li><li><a href="http://del.icio.us/help/support">support</a></li><li><a class="rss" href="/rss/" title="RSS"><img src="http://images.del.icio.us/static/img/rss.gif" width="36" height="14" alt="RSS" /></a> feed for this page</li></ul>'

list = re.findall(ausdr, line)
print(list)
Wie wäre es denn damit?

Verfasst: Dienstag 18. Dezember 2007, 21:35
von Python 47
breize hat geschrieben:Aus der Wikipedia
Zu Beginn war Perl ein UNIX-Werkzeug, das besonders auf die Verarbeitung von Textdateien, Steuerung anderer Programme sowie zur Ausgabe von Berichten ausgelegt war.
Und deswegen kann man das auch auf andere Scriptsprachen induzieren. :lol:

Verfasst: Dienstag 18. Dezember 2007, 21:36
von nkoehring
Den kram vor dem http:// bekommst du ganz einfach weg, indem du nach der Position von "http" suchst.. (siehe dazu die String-Methode find) und eben alles vor dieser Position per Slicing wegloescht.

Wie schon haeufig erwaehnt ist das was du mit "zeichenkette.count" erreichen moechtest, mit len(zeichenkette) erreichbar.
Du solltest dich evtl mal mit der Dokumentation auseinandersetzen:

Code: Alles auswählen

In [18]: str.count?
Type:           method_descriptor
Base Class:     <type 'method_descriptor'>
String Form:    <method 'count' of 'str' objects>
Namespace:      Python builtin
Docstring:
    S.count(sub[, start[, end]]) -> int



Return the number of non-overlapping occurrences of substring sub in
string S[start:end].  Optional arguments start and end are interpreted
as in slice notation.
achja... bevor du dich daran machst, Fragezeichen in deinem Code zu verwenden: Das ist IPython und Fragezeichen gibt es auch nur dort und nicht in Python selbst... ;)

EDIT:

Code: Alles auswählen

print listevonzahlen[:len(listevonzahlen)-1]
das geht auch kuerzer:

Code: Alles auswählen

print listevonzahlen[:-1]
[:-1] ist also mit einem "bis zum vorletzten Zeichen" zu uebersetzen.

Verfasst: Dienstag 18. Dezember 2007, 21:54
von breize
Hey, danke für eure Antworten, macht ja richtig Spass hier :D

Ich denke die Lösung von "Hobbes Hobson" macht für meine Anwendung am meisten Sinn, ich hatte mich noch nicht so weitgehend mit den Regex befasst das mir diese Möglichkeit hätte bekannt sein können.

Die Sache mit dem Slicing ist allerdings auch nett, ist mir in dieser Hinsicht aber auch neu, da ich jetzt relativ lange nur in VB6 (Ja hier kann man zurecht Buh-Rufen) programmiert habe.... Aber wie war das, "Wer einmal in Basic programmiert hat ist unwiderbringlich verloren"? ;)

Verfasst: Dienstag 18. Dezember 2007, 22:52
von nkoehring
breize hat geschrieben:Hey, danke für eure Antworten, macht ja richtig Spass hier :D
Ich mag dieses Forum auch ;)
breize hat geschrieben:Ich denke die Lösung von "Hobbes Hobson" macht für meine Anwendung am meisten Sinn, ich hatte mich noch nicht so weitgehend mit den Regex befasst das mir diese Möglichkeit hätte bekannt sein können.
Wenn du diese Moeglichkeit benutzt, sollte deine RegEx aber auch vernuenftig sein...
Ein Beispiel waere da zB:

Code: Alles auswählen

"((ht|f)tp(s?)\:\/\/|~/|/)?([\w]+:\w+@)?(([a-zA-Z]{1}([\w\-]+\.)+([\w]{2,6})))((:[\d]{1,5})?)?((/?\w+/)+|/?)([\w\-]+\.[\w]{3,4})?([,]\w+)*((\?\w+=\w+)?(&\w+=\w+)*([,]\w*)*)?"
*hust*
breize hat geschrieben:Aber wie war das, "Wer einmal in Basic programmiert hat ist unwiderbringlich verloren"? ;)
Ach das will ich doch mal nicht hoffen... sonst waere meine ganze Ueberzeugungsarbeit (alla Nimm doch Python *huestel*) total umsonst ;)