PERL-regex-problem
am 02.08.2006 13:29:55 von Jean Putmans
Kann mir jemand mal bei folgendem PERL-regex-Problem helfen
(perl, v5.8.7 built for i586-linux):
1: s/\bVorratsgefäß(es)?/container/g; (Funktioniert)
2: s/\bVorratsgefäß(es)?\b/container/g; (Funktioniert nicht)
3: s/\bdaß/dass/g; (Funktioniert)
4: s/\bdaß\b/dass/g; (Funktioniert nicht)
5: s/\bdaß /dass /g; (Funktioniert).
Verwende ich diese Regeln unter sed (mit entsprechender Umänderung der
Wortgrenzmarkierungen in \< und \>) dann funktionieren diese Regeln
allesamt einwandfrei. Bei Perl aber macht die Kombination von ß mit
nachfolgendem \b oder mit nachfolgendem (.) und dann einem abschließenden
\b Zicken.
Ich habe mir schon überlegt, das Ganze zu umgehen, durch Änderung von allen
ß in beispielsweise SSSS, aber dann werden die betreffenden Regeln schwer
leserlich (und ich habe Dateien mit Tausenden dieser Regeln, also bequemes
Lesen ist angebracht!).
Ich wüßte gerne, was ich machen kann, damit die so nicht funktionierenden
Regeln wohl funktionieren?
Gruss,
Jean Putmans
Re: PERL-regex-problem
am 02.08.2006 13:39:03 von post
Jean Putmans wrote:
>
> Kann mir jemand mal bei folgendem PERL-regex-Problem helfen
> (perl, v5.8.7 built for i586-linux):
>
>
> 1: s/\bVorratsgefäß(es)?/container/g; (Funktioniert)
>
> 2: s/\bVorratsgefäß(es)?\b/container/g; (Funktioniert nicht)
>
> 3: s/\bdaß/dass/g; (Funktioniert)
>
> 4: s/\bdaß\b/dass/g; (Funktioniert nicht)
>
> 5: s/\bdaß /dass /g; (Funktioniert).
Hallo Jean,
aus der perlre manpage:
"A word boundary (\b) is a spot between two characters that has a \w on one
side of it and a \W on the other side of it (in either order)"
ß gehört meines Erachtens nicht zu \w, d.h. Du wirst mit
s/\bVorratsgefäß(es)?[^a-zA-ZäöüÄÖÜß]/container/g;
bzw.
s/\bdaß[^a-zA-ZäöüÄÖÜß]/dass/g;
arbeiten müssen :(
Gruß,
Udo
--
That which is not good for the bee-hive cannot be good for the bees.
Re: PERL-regex-problem
am 02.08.2006 13:55:35 von Ingo Menger
Udo Güngerich wrote:
> Jean Putmans wrote:
>
> >
> > Kann mir jemand mal bei folgendem PERL-regex-Problem helfen
> > (perl, v5.8.7 built for i586-linux):
> >
> >
> > 1: s/\bVorratsgefäß(es)?/container/g; (Funktioniert)
> >
> > 2: s/\bVorratsgefäß(es)?\b/container/g; (Funktioniert nicht)
> >
> > 3: s/\bdaß/dass/g; (Funktioniert)
> >
> > 4: s/\bdaß\b/dass/g; (Funktioniert nicht)
> >
> > 5: s/\bdaß /dass /g; (Funktioniert).
>
> Hallo Jean,
>
> aus der perlre manpage:
>
> "A word boundary (\b) is a spot between two characters that has a \w on o=
ne
> side of it and a \W on the other side of it (in either order)"
>
> ß gehört meines Erachtens nicht zu \w,
Du erachtest falsch.
Es hängt von der locale ab.
Diese kann man abfragen und setzen, s. perldoc Locale
Wenn man ß und die Umlaute als Wort-Zeichen haben möchte, empfiehlt
sich eine deuscthe Locale.
@OP: Warum möchtest Du "daß" durch "dass" ersetzen? Mindestens 8 bit
verschleudert, für schlechtere Lesbarkeit und einen Kotau vor dem
Kultusministerium und dem Rat für Rechtschreibung.
Ich schlage daher vor, die Regel wie folgt zu ändern:
s/\bdass\b/daß/
Re: PERL-regex-problem
am 02.08.2006 13:57:16 von post
Ingo Menger wrote:
>
> Du erachtest falsch.
> Es hängt von der locale ab.
> Diese kann man abfragen und setzen, s. perldoc Locale
> Wenn man ß und die Umlaute als Wort-Zeichen haben möchte, empfiehlt
> sich eine deuscthe Locale.
Dann schlage ich vor, sollte man das encoding überprüfen (Perl <->
Dateisystem)?!
Wenn die nicht übereinstimmen, dann sucht Perl nach ß und findet irgendeine
andere Bytefolge...
Gruß,
Udo
--
That which is not good for the bee-hive cannot be good for the bees.
Re: PERL-regex-problem
am 02.08.2006 13:57:17 von Christian Kirsch
Udo Güngerich schrieb:
> Jean Putmans wrote:
>
>> Kann mir jemand mal bei folgendem PERL-regex-Problem helfen
>> (perl, v5.8.7 built for i586-linux):
>>
>>
>> 1: s/\bVorratsgefäß(es)?/container/g; (Funktioniert)
>>
>> 2: s/\bVorratsgefäß(es)?\b/container/g; (Funktioniert nicht)
>>
>> 3: s/\bdaß/dass/g; (Funktioniert)
>>
>> 4: s/\bdaß\b/dass/g; (Funktioniert nicht)
>>
>> 5: s/\bdaß /dass /g; (Funktioniert).
>
> Hallo Jean,
>
> aus der perlre manpage:
>
> "A word boundary (\b) is a spot between two characters that has a \w on one
> side of it and a \W on the other side of it (in either order)"
>
> ß gehört meines Erachtens nicht zu \w, d.h. Du wirst mit
>
ob ß (und öäüñç etc.pp.) zu \w gehört, hängt m.E. vom Locale ab. Wenn
(wie üblich) C/POSIX eingestellt ist, hast Du Recht.
Re: PERL-regex-problem
am 02.08.2006 14:04:46 von Herbert Voss
Ingo Menger wrote:
> @OP: Warum möchtest Du "daß" durch "dass" ersetzen? Mindestens 8 bit
> verschleudert, für schlechtere Lesbarkeit und einen Kotau vor dem
> Kultusministerium und dem Rat für Rechtschreibung.
> Ich schlage daher vor, die Regel wie folgt zu ändern:
> s/\bdass\b/daß/
dann wohl eher s/\bdass\b/dahs/
denn du willst ja keinen Kotau machen ...
Herbert
Re: PERL-regex-problem
am 02.08.2006 14:08:22 von Jean Putmans
Ingo Menger wrote:
> @OP: Warum möchtest Du "daß" durch "dass" ersetzen? Mindestens 8 bit
> verschleudert, für schlechtere Lesbarkeit und einen Kotau vor dem
> Kultusministerium und dem Rat für Rechtschreibung.
> Ich schlage daher vor, die Regel wie folgt zu ändern:
> s/\bdass\b/daß/
Das war nur ein Beispiel, ich erstelle mit Perl ein sogenanntes
Pre-Translation-System für Deutsch-Niederländische Übersetzungen. Dann
wird "daß" niederländisch "dat".
Gruss,
Jean
Re: PERL-regex-problem
am 02.08.2006 14:21:04 von Ingo Menger
Jean Putmans wrote:
> Ingo Menger wrote:
>
> > @OP: Warum möchtest Du "daß" durch "dass" ersetzen? Mindestens 8 bit
> > verschleudert, für schlechtere Lesbarkeit und einen Kotau vor dem
> > Kultusministerium und dem Rat für Rechtschreibung.
> > Ich schlage daher vor, die Regel wie folgt zu ändern:
> > s/\bdass\b/daß/
> Das war nur ein Beispiel, ich erstelle mit Perl ein sogenanntes
> Pre-Translation-System für Deutsch-Niederländische Übersetzungen. D=
ann
> wird "daß" niederländisch "dat".
Aha. Dann solltest Du darauf achten, daß das Stück Code, das deutsche
Texte analysiert, deutsch lokalisiert ist.
Wenn es ganz schlimm kommt, kann man sich zur Not auch eine eigene
Locale schaffen, die z.B. alle Latin-1-Buchstaben als Wortzeichen
deklariert, wie =E0, =E9, ~n usw.
Du erkennst sonst in der deutschen Lokale im Satz "Mein französischer
Freund heißt Andr=E9" den Namen nicht als Wort.
Re: PERL-regex-problem
am 02.08.2006 17:34:19 von Helmut Wollmersdorfer
Jean Putmans wrote:
> Das war nur ein Beispiel, ich erstelle mit Perl ein sogenanntes
> Pre-Translation-System für Deutsch-Niederländische Übersetzungen. Dann
> wird "daß" niederländisch "dat".
Wenn Du nur Worte (und nicht Phrasen) übersetzen willst, dann würde ich
den Text zuerst in Worte zerlegen, und danach mit einer indizierten
Methode (Hash, Datenbank) weiter behandeln. Sollte mit Phrasen auch
funktionieren, wenn Du eine halbwegs saubere Phrasenzerlegung hinbekommst.
Helmut Wollmersdorfer
Re: PERL-regex-problem
am 02.08.2006 20:51:48 von Jean Putmans
Helmut Wollmersdorfer wrote:
> Jean Putmans wrote:
>
>> Das war nur ein Beispiel, ich erstelle mit Perl ein sogenanntes
>> Pre-Translation-System für Deutsch-Niederländische Übersetzungen. Dann
>> wird "daß" niederländisch "dat".
>
> Wenn Du nur Worte (und nicht Phrasen) übersetzen willst, dann würde ich
> den Text zuerst in Worte zerlegen, und danach mit einer indizierten
> Methode (Hash, Datenbank) weiter behandeln. Sollte mit Phrasen auch
> funktionieren, wenn Du eine halbwegs saubere Phrasenzerlegung hinbekommst.
>
> Helmut Wollmersdorfer
Hallo Helmut,
Das mit den Wörtern funktioniert auch so, wie Du es dargelegt hast. In die
jeweiligen Datenbanken werden nur Wörter (wobei die verschiedenen
Wortformen durch REGEX-Regeln berücksichtigt werden) aufgenommen, die bei
der Übersetzung als 1:1-Entsprechung gelten können (das System wird für
reine Fachtexte verwendet, Chemie, Pharmazie, Medizin usw., so dass häufig
diese 1:1-Entsprechungen vorliegen).
Mit den Phrasen bleibt es vorläufig bei der Selektion durch reine
Handarbeit. Sie werden allerdings wohl in einer Phrasendatei abgelegt und
weitestgehend mit teils umfangreichen REGEX-Regeln in die
teilautomatisierte Übersetzung einbezogen.
Zum Glück sind die Syntax-Regeln im Niederländischen und im Deutschen
weitgehend parallel (die Ausnahmen in der Wortstellung bedürfen noch der
weiteren Aufarbeitung mittels REGEX-Regeln).
Das System funktioniert nun seit mehr als zwei Jahren prima mit SED. Doch
stösst SED an seine Grenzen, wenn es um Sachen wie Lookahead, Lookbehind,
Greedy/Lazy-Matching geht. Aus dem Grunde habe ich mich jetzt mit PERL
beschäftigt. Ich muss sagen, PERL imponiert mir, insbesondere auch was die
Geschwindigkeit anbelangt. Allerdings habe ich regelmässig
Verstandnisprobleme, wo es um die reine Programmiererei geht (immerhin bin
ich Übersetzer, kein Programmierer). Und bis ich so weit bin, dass ich PERL
auch tatsächlich als Grundlage für das übersetzungssystem verwenden werde,
wird es wohl noch ein Weilchen dauern.
Gruss,
Jean
Re: PERL-regex-problem
am 06.08.2006 17:45:25 von hjp-usenet2
On Wed, 02 Aug 2006 05:21:04 -0700, Ingo Menger wrote:
> Dann solltest Du darauf achten, daà das Stück Code, das deutsche
> Texte analysiert, deutsch lokalisiert ist.
> Wenn es ganz schlimm kommt, kann man sich zur Not auch eine eigene
> Locale schaffen, die z.B. alle Latin-1-Buchstaben als Wortzeichen
> deklariert, wie à , é, ~n usw.
Welche auf Latin-1 aufbauende Locale tut das nicht?
hp
--
_ | Peter J. Holzer | > Wieso sollte man etwas erfinden was nicht
|_|_) | Sysadmin WSR | > ist?
| | | hjp@hjp.at | Was sonst wäre der Sinn des Erfindens?
__/ | http://www.hjp.at/ | -- P. Einstein u. V. Gringmuth in desd
Re: PERL-regex-problem
am 07.08.2006 10:14:06 von Ingo Menger
Peter J. Holzer wrote:
> On Wed, 02 Aug 2006 05:21:04 -0700, Ingo Menger wrote:
> > Dann solltest Du darauf achten, daß das Stück Code, das deutsche
> > Texte analysiert, deutsch lokalisiert ist.
> > Wenn es ganz schlimm kommt, kann man sich zur Not auch eine eigene
> > Locale schaffen, die z.B. alle Latin-1-Buchstaben als Wortzeichen
> > deklariert, wie =E0, =E9, ~n usw.
>
> Welche auf Latin-1 aufbauende Locale tut das nicht?
Weiß ich nicht, ehrlich gesagt.
Ich hab angenommen, daß eine deutsche Lokale ~n z.B. nicht als
Buchstaben führt, oder zumindest nicht führen muß, nur weil sie auf
einem Zeichensatz aufbaut, der einen Codepoint für ~n enthält.
Täusche ich mich da, und wenn ja, wo steht das?
Re: PERL-regex-problem
am 07.08.2006 21:56:12 von hjp-usenet2
On Mon, 07 Aug 2006 01:14:06 -0700, Ingo Menger wrote:
> Peter J. Holzer wrote:
>> On Wed, 02 Aug 2006 05:21:04 -0700, Ingo Menger wrote:
>> > Dann solltest Du darauf achten, daà das Stück Code, das deutsche
>> > Texte analysiert, deutsch lokalisiert ist.
>> > Wenn es ganz schlimm kommt, kann man sich zur Not auch eine eigene
>> > Locale schaffen, die z.B. alle Latin-1-Buchstaben als Wortzeichen
>> > deklariert, wie à , é, ~n usw.
>>
>> Welche auf Latin-1 aufbauende Locale tut das nicht?
>
> Weià ich nicht, ehrlich gesagt.
> Ich hab angenommen, daà eine deutsche Lokale ~n z.B. nicht als
> Buchstaben führt, oder zumindest nicht führen muÃ, nur weil sie auf
> einem Zeichensatz aufbaut, der einen Codepoint für ~n enthält.
Müssen tut sie wohl nicht - mir sind da jedenfalls keine Vorschriften
bekannt. Es ist aber sinnvoll - denn was sollte ñ sonst sein als ein
Buchstabe? Da nun einmal jede Locale für jeden Codepoint festlegen muss,
zu welchen Zeichenklassen er gehört, steht derjenige, der eine auf
Latin-1 aufbauende Locale auf jeden Fall vor der Frage, ob der Codepoint
0xF1 (LATIN SMALL LETTER N WITH TILDE) ein Buchstabe, eine Ziffer, ein
Interpunktionszeichen, ein Control-Zeichen, etc. ist. Und da müsste er
schon einen wirklich guten Grund haben, warum ein "latin small letter"
kein "letter" sein sollte.
hp
--
_ | Peter J. Holzer | > Wieso sollte man etwas erfinden was nicht
|_|_) | Sysadmin WSR | > ist?
| | | hjp@hjp.at | Was sonst wäre der Sinn des Erfindens?
__/ | http://www.hjp.at/ | -- P. Einstein u. V. Gringmuth in desd
Re: PERL-regex-problem
am 08.08.2006 11:14:33 von Ingo Menger
Peter J. Holzer wrote:
> On Mon, 07 Aug 2006 01:14:06 -0700, Ingo Menger wrote:
> > Peter J. Holzer wrote:
> >> On Wed, 02 Aug 2006 05:21:04 -0700, Ingo Menger wrote:
> >> > Dann solltest Du darauf achten, daß das Stück Code, das deutsche
> >> > Texte analysiert, deutsch lokalisiert ist.
> >> > Wenn es ganz schlimm kommt, kann man sich zur Not auch eine eigene
> >> > Locale schaffen, die z.B. alle Latin-1-Buchstaben als Wortzeichen
> >> > deklariert, wie =E0, =E9, ~n usw.
> >>
> >> Welche auf Latin-1 aufbauende Locale tut das nicht?
> >
> > Weiß ich nicht, ehrlich gesagt.
> > Ich hab angenommen, daß eine deutsche Lokale ~n z.B. nicht als
> > Buchstaben führt, oder zumindest nicht führen muß, nur weil sie a=
uf
> > einem Zeichensatz aufbaut, der einen Codepoint für ~n enthält.
>
> Müssen tut sie wohl nicht - mir sind da jedenfalls keine Vorschriften
> bekannt. Es ist aber sinnvoll - denn was sollte =F1 sonst sein als ein
> Buchstabe? Da nun einmal jede Locale für jeden Codepoint festlegen muss,
> zu welchen Zeichenklassen er gehört, steht derjenige, der eine auf
> Latin-1 aufbauende Locale auf jeden Fall vor der Frage, ob der Codepoint
> 0xF1 (LATIN SMALL LETTER N WITH TILDE) ein Buchstabe, eine Ziffer, ein
> Interpunktionszeichen, ein Control-Zeichen, etc. ist. Und da müsste er
> schon einen wirklich guten Grund haben, warum ein "latin small letter"
> kein "letter" sein sollte.
Klingt vernünftig.
Ebenso vernünftig wäre es aber auch, im Duden nachzuschlagen und die
Definition[*] zu finden, daß die deutsche Sprache die Buchtaben
a-zäöüß kennt und es dann so zu implementieren.
[*] Keine Ahnung, ob der Duden so etwas wirklich vorschreibt. Was es
auf jeden Fall gibt sind DIN Normen für Tastaturen, etc.
In Sprachen, die Unicode unterstützen, ist es wohl so, daß
"Buchstabe" alles ist, was in irgendeiner Sprache Buchstabe ist. Da
relativiert sich m.E. die Sinnhaftigkeit der Sache schon wieder. Die
hypothetische Zeichenfolge
epsilon>
THE BRINGER OF RAIN> würde dann von \w+ als
Wort erkannt. Ob das in jedermanns Sinne ist ... Es wird dann recht
schwierig sowas zu prüfen wie "In Zeile 3 steht am Anfang ein
deutsches Wort (naja, eines, das aus deutschen Buchstaben besteht.)"
Re: PERL-regex-problem
am 08.08.2006 11:40:28 von Christian Kirsch
Ingo Menger schrieb:
> Klingt vernünftig.
> Ebenso vernünftig wäre es aber auch, im Duden nachzuschlagen und die
> Definition[*] zu finden, daß die deutsche Sprache die Buchtaben
> a-zäöüß kennt und es dann so zu implementieren.
> [*] Keine Ahnung, ob der Duden so etwas wirklich vorschreibt. Was es
> auf jeden Fall gibt sind DIN Normen für Tastaturen, etc.
Der Duden sagt nichts darüber, welche Buchstaben "die deutsche
Sprache" kenne. Er führt aber das Wort "Señor" auf.
>
> In Sprachen, die Unicode unterstützen, ist es wohl so, daß
> "Buchstabe" alles ist, was in irgendeiner Sprache Buchstabe ist.
Was ist denn eine "Sprache, die Unicode untersützt"? Unicode
beschäftigt sich doch in erster Linie mit Glyphen, und die wiederum
dienen dazu, irgendwelche Sprachen zu Papier zu bringen. Also könnte
es höchstens umgekehrt einen Sinn ergeben ("Sprachen, die Unicode
unterstützt").
> Da
> relativiert sich m.E. die Sinnhaftigkeit der Sache schon wieder. Die
> hypothetische Zeichenfolge
> epsilon>
> THE BRINGER OF RAIN> würde dann von \w+ als
> Wort erkannt.
> Ob das in jedermanns Sinne ist ... Es wird dann recht
> schwierig sowas zu prüfen wie "In Zeile 3 steht am Anfang ein
> deutsches Wort (naja, eines, das aus deutschen Buchstaben besteht.)"
>
Das geht doch jetzt schon nicht. Oder wie möchtest Du feststellen, ob
"die" ein deutscher Artikel oder ein englisches Substantiv oder ein
englisches Verb ist? Wann genau wäre ein "A" am Satzanfang eine
französische Präposition, wann ein englischer Artikel? Da wird man
wohl andere Verfahren als Regexes bemühen müssen, so mächtig die auch
sind.
Re: PERL-regex-problem
am 08.08.2006 12:39:21 von Ingo Menger
Christian Kirsch wrote:
> Ingo Menger schrieb:
>
> > Klingt vernünftig.
> > Ebenso vernünftig wäre es aber auch, im Duden nachzuschlagen und die
> > Definition[*] zu finden, daß die deutsche Sprache die Buchtaben
> > a-zäöüß kennt und es dann so zu implementieren.
> > [*] Keine Ahnung, ob der Duden so etwas wirklich vorschreibt. Was es
> > auf jeden Fall gibt sind DIN Normen für Tastaturen, etc.
>
> Der Duden sagt nichts darüber, welche Buchstaben "die deutsche
> Sprache" kenne. Er führt aber das Wort "Se=F1or" auf.
Ja dann sollte man in der Tat annehmen, zu der Vermutung berechtigt zu
sein, daß die locales dementsprechend gestaltet sind. :)
(Ich hab schon Pferde kotzen sehen. deshalb sage ich das so vorsichtig.
ZB. in den 90er-jahren einen C++ Compiler von IBM (xlc), der in der
Locale de_DE im Sourcecode keine Gleitkommaliterale wie 3.1415 erkannt
hat:)
> > In Sprachen, die Unicode unterstützen, ist es wohl so, daß
> > "Buchstabe" alles ist, was in irgendeiner Sprache Buchstabe ist.
>
> Was ist denn eine "Sprache, die Unicode untersützt"?
Programmiersprache, in dem Kontext. Ich dachte an Java, die haben ja
auch ein Regex-Paket.
> > Da
> > relativiert sich m.E. die Sinnhaftigkeit der Sache schon wieder. Die
> > hypothetische Zeichenfolge
> > epsilon>
> > THE BRINGER OF RAIN> würde dann von \w+ als
> > Wort erkannt.
> > Ob das in jedermanns Sinne ist ... Es wird dann recht
> > schwierig sowas zu prüfen wie "In Zeile 3 steht am Anfang ein
> > deutsches Wort (naja, eines, das aus deutschen Buchstaben besteht.)"
> >
>
> Das geht doch jetzt schon nicht. Oder wie möchtest Du feststellen, ob
> "die" ein deutscher Artikel oder ein englisches Substantiv oder ein
> englisches Verb ist?
Das ist ja nicht gefragt. Steht da
"die or eat dust"
ist offenkundig die Aussage: "An erster Stelle steht ein deutsches
Wort." richtig. :)
Aber Du hast natürlich generell recht, wahrscheinlich sind Regexes
für solche linguistischen Sachen nicht besonders geeignet.