regexp zum Zaehlen von Buchstaben

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von rikola, 05.12.2008.

  1. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    Hallo,

    ich wuesste gerne den regulaeren Ausdruck (fuer grep o.ae.), um Zeilen aus einer Textdatei auszuwaehlen, die einen bestimmten Buchstaben hoechstens n-mal enthalten (nicht unbeding hintereinander)

    Ich moechte zum Beispiel aus der Datei
    Code:
    eeeee
    eee
    awdeeftge
    aefgesde
    werwet
    flhlkghk
    efefefefefef
    
    nur die Zeilen haben, die hoechstens 3 'e' enthalten, also in diesem Beispiel alle ausser der ersten und der letzten.

    Danke sehr.
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 bytepool, 05.12.2008
    Zuletzt bearbeitet: 05.12.2008
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    das erinnert mich an meine Klausur theoretische Informatik, lang lang ist's her... Wie ging das doch gleich? Ahja, das laesst sich mit einem finite state automaton sehr leicht modeln (sorry, ich kenne den deutschen Fachausdruck nicht).
    Du nimmst 4 states, und bleibst in jedem state genau so lange bis du ein "e" antriffst. Das laesst sich dann sehr leicht in eine regexp umwandeln.
    Hier mal ohne eine konkrete Syntax zu verwenden:
    Code:
    [A-DF-Za-df-z]*e[A-DF-Za-df-z]*e[A-DF-Za-df-z]*e[A-DF-Za-df-z]*
    
    Das sollte es tun.

    Edit:
    Eh, fuer Gross- und Kleinbuchstaben natuerlich entsprechend anpassen, ich sehe grade dass jetzt nur kleine "e"s gematcht werden, aber das duerfte ja bekannt sein wie das funktioniert. ;)

    mfg,
    bytepool
     
  4. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    Passt dieser Ausdruck nicht auch dann, wenn davor oder danach noch weitere e's kaemen? Zumindest filtert grep bei Deinem Ausdruck nicht die erste oder letzte Zeile aus.
     
  5. #4 bytepool, 05.12.2008
    Zuletzt bearbeitet: 05.12.2008
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    das sollte eigentlich nicht passieren, nein. Schliesslich schliesst du das e explizit aus ([A-DF-Za-df-z]), und sagst dass es genau dreimal vorkommen darf.

    Allerdings ist das auch ein ungetestetes theoretisches Konstrukt, es koennte sein dass es fuer die Praxis mit einem konkreten regexp System noch leicht angepasst werden muss.

    Wenn grep das unterstuetzt koenntest du mal versuchen die Anzahl der einzelnen e's auf genau eins festzulegen (meistens mit e{1}).

    Edit:
    Ach, natuerlich gibt dir grep die Zeile aus. Der Ausdruck kommt ja in der Zeile vor, hatte kurzzeitig verdraengt was grep macht...
    D.h. du muesstest noch explizit festlegen dass davor und danach nichts mehr sein darf, z.B. mit den Ankern ^ und $.

    Edit2:
    Eventuell laesst sich der Ausdruck sogar noch weiter verallgemeinern und vereinfachen:
    Code:
    ^[^e]*e[^e]*e[^e]*e[^e]*$
    
    ;)

    mfg,
    bytepool
     
  6. #5 Gott_in_schwarz, 05.12.2008
    Zuletzt bearbeitet: 05.12.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    Ist doch traurig hier, nix mit finite state machine, nix mit regexp, einfach nur "tr" Operator in perl:
    Code:
    $ echo -e 'e,e,eee\nebe\nesse\nsesambroetchen\neeee\nfoo'|
    perl -ne 'print if tr/e/e/ <= 3'
    tr/// in skalarem Kontext (der durch's if-Konstrukt gegeben ist) gibt einfach die Anzahl der "matches" zurück. (tr arbeitet nicht mit regulären Ausdrücken.)

    edit: hupsale, es wurde ja explizit nach einer RE gefragt, dann vereinfache ich doch einfach mal die vom bytepool:
    Code:
    ^([^e]*e){3}[^e]*$
    (Sollte afaik exakt das Selbe sein. (Oder das Gleiche? kA))
    Aber für sowas Regexes zu nutzen ist doch auch wieder traurig, aber naja.
     
  7. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  8. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    Danke an beide. Auch perl war prima, mir kam nur nicht in den Sinn, dass es ohne regexp funktionieren koennte.
    Die regexp von Gott_in_schwarz funktioniert bei mir allerdings nicht (wohl der perl-Ausdruck).
     
  9. #7 Gott_in_schwarz, 05.12.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    Ich hab den ja auch nur durch Klammerung syntaktisch minimiert. Der Ausdruck matcht halt genau Zeilen mit N (die Zahl in den kräuseligen Klammern ({})) e's. Nicht mehr und nicht weniger.
    Da du aber höchstens sagtest, muss man aus der {3} eine {0,3} (sprich: 0 bis 3 mal) machen:
    Code:
    echo -e 'e,e,eee\nebe\nesse\nsesambroetchen\neeee\nfoo'|
    perl -ne 'print if /^(?:[^e]*e){0,3}[^e]*$/'
    Aber wie du siehst sind regexes für sowas eher ungeeignet.

    edit: oder auch mit egrep:
    Code:
    echo -e 'e,e,eee\nebe\nesse\nsesambroetchen\neeee\nfoo'|
    egrep '^([^e]*e){0,3}[^e]*$'
     
Thema:

regexp zum Zaehlen von Buchstaben

Die Seite wird geladen...

regexp zum Zaehlen von Buchstaben - Ähnliche Themen

  1. regexp für alle user einer bestimmten Maildomain

    regexp für alle user einer bestimmten Maildomain: Hallo, ich brauche den regulären Ausdruck, der mir erlaubt alle Mailadressen von firma.de zu filtern. Ich habe es schon mit folgenden...
  2. RegExp für "Wort|NN"

    RegExp für "Wort|NN": Hallo zusammen, ich habe eine Textdatei mit einigen tausend Zeilen, die in etwa so aussehen: ---------- Absenkung|NN -0.3434 Absenkungen...
  3. Blockade bei regexp - wie Exact-Match definieren?

    Blockade bei regexp - wie Exact-Match definieren?: Hallo Leute, komme gerade nicht weiter, dabei ist es eig. was banales. Wollte mit grep nach nem definierten Wert suchen und aufgrund der hohen...
  4. regexp

    regexp: lo zusammen, mein 100. post in den letzten paar tagen aber komme schon wieder nicht weiter... ich möchte in meinem script prüfen lassen, ob eine...
  5. Denkfehler bei PHP / regexp?

    Denkfehler bei PHP / regexp?: Moin Moin! Ich habe ein Problem, an dem ich nun schon seit 2 Tagen sitze und ich langsam kein Land mehr sehe... :-( Ich habe einen 130k...