Buchstabe aus String löschen...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
breize
User
Beiträge: 7
Registriert: Dienstag 27. November 2007, 20:02

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
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'
Benutzeravatar
breize
User
Beiträge: 7
Registriert: Dienstag 27. November 2007, 20:02

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...
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Einfach gleich

Code: Alles auswählen

line = line[1:]
Und deine Schleifenbedingung ist glaube ich eine etwas andere, als du vielleicht denkst.
Benutzeravatar
Hobbes Hobson
User
Beiträge: 42
Registriert: Sonntag 9. Dezember 2007, 15:24
Wohnort: Bremen

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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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")?
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!?
Benutzeravatar
breize
User
Beiträge: 7
Registriert: Dienstag 27. November 2007, 20:02

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:
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

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?
mfg

Thomas :-)
Benutzeravatar
breize
User
Beiträge: 7
Registriert: Dienstag 27. November 2007, 20:02

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...
Benutzeravatar
Hobbes Hobson
User
Beiträge: 42
Registriert: Sonntag 9. Dezember 2007, 15:24
Wohnort: Bremen

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.
Benutzeravatar
breize
User
Beiträge: 7
Registriert: Dienstag 27. November 2007, 20:02

Ja genau, ich will einfach nur den Link haben
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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]
Zuletzt geändert von Darii am Dienstag 18. Dezember 2007, 21:28, insgesamt 1-mal geändert.
Benutzeravatar
Hobbes Hobson
User
Beiträge: 42
Registriert: Sonntag 9. Dezember 2007, 15:24
Wohnort: Bremen

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?
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

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:
mfg

Thomas :-)
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

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.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
breize
User
Beiträge: 7
Registriert: Dienstag 27. November 2007, 20:02

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"? ;)
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

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 ;)
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Antworten