[Python-de] regex: Ausdruck matches wen auf einer Zeile, fails when "freespacing"

2 views
Skip to first unread message

robert rottermann

unread,
Dec 8, 2022, 2:29:21 AM12/8/22
to
Hoi zäme


Ich habe eine regular Expression um Sektionen in einem ini-File zu filtern.

Dieser Ausdruck funktioniert wenn er auf eine Zeile geschrieben wird. Also:

sp0 = '^\[[^\]\r\n]+](?:\r?\n(?:[^\[r\n].*)?)*'

Nicht aber wenn er "free spacing" geschrieben ist:

sp2 = """
^\[[^\]\r\n]+]            # match a section header
(?:                       # followed by the rest of the section
    \r?\n                 # match a line break sequence
    (?:                   # after Each line starts match
        [^[\r\n]           # Any character except "\[" or line break
        .*                # match rest of the line
    )?                    # Group is optional to match empty lines
)*                        # Continue until end of section
"""

import re
FNANME = '/home/robert/workbench/helpers/python/regexp/odoo_samp.cfg'

with open(FNANME) as f:
    txt = f.read()

res0 = re.findall(sp0, txt)    # <----- OK
res2 = re.findall(sp2, txt)    # resultiert in leerer Liste

res0 = re.findall(sp0, txt, re.X)    # re.error: nothing to repeat at position
16 (line 2, column 8)
res2 = re.findall(sp2, txt, re.X)    # re.error: nothing to repeat at position
17 (line 3, column 5)


Muss ich noch irgend ein Flag setzen?

danke für Eure Hilfe

schöne Adventszeit

Robert

Christopher Arndt

unread,
Dec 8, 2022, 3:04:16 AM12/8/22
to
Am 08.12.22 um 08:20 schrieb robert rottermann:
> Muss ich noch irgend ein Flag setzen?
a) Du solltest Raw Strings verwenden:

regex = r"..."

b) Statt "\r\n" zu matchen, verwende re.MULTILINE und "^" und "$".

c) Regular expressions sind für so was nur bedingt geeignet, besser wäre
es einen Parser zu definieren, z.B. mit PyParsing:

https://github.com/pyparsing/pyparsing/blob/master/examples/configParse.py

Chris

Peter J. Holzer

unread,
Dec 8, 2022, 6:29:02 AM12/8/22
to
On 2022-12-08 07:20, robert rottermann <rob...@redcor.ch> wrote:
> Ich habe eine regular Expression um Sektionen in einem ini-File zu filtern.
>
> Dieser Ausdruck funktioniert wenn er auf eine Zeile geschrieben wird. Also:
>
> sp0 = '^\[[^\]\r\n]+](?:\r?\n(?:[^\[r\n].*)?)*'

Auch eher nur zufällig.

> Nicht aber wenn er "free spacing" geschrieben ist:
>
> sp2 = """
> ^\[[^\]\r\n]+]            # match a section header
> (?:                       # followed by the rest of the section
>     \r?\n                 # match a line break sequence
>     (?:                   # after Each line starts match
>         [^[\r\n]           # Any character except "\[" or line break
>         .*                # match rest of the line
>     )?                    # Group is optional to match empty lines
> )*                        # Continue until end of section
> """

Füge an dieser Stelle

print(f"sp0=«{sp0}»")
print(f"sp2=«{sp2}»")

ein, dann siehst Du, wo der Fehler liegt.

hp

Stefan Schwarzer

unread,
Dec 8, 2022, 9:07:21 AM12/8/22
to
On 2022-12-08 08:20, robert rottermann wrote:
> Ich habe eine regular Expression um Sektionen in einem ini-File zu filtern.
>
> Dieser Ausdruck funktioniert wenn er auf eine Zeile geschrieben wird. Also:
>
> sp0 = '^\[[^\]\r\n]+](?:\r?\n(?:[^\[r\n].*)?)*'
>
> Nicht aber wenn er "free spacing" geschrieben ist:
>
> [...]

> Muss ich noch irgend ein Flag setzen?

Du möchtest vermutlich `re.VERBOSE`:
https://docs.python.org/3/library/re.html#re.VERBOSE

> schöne Adventszeit

Dir auch. :)

Viele Grüße
Stefan

Stefan Schwarzer

unread,
Dec 8, 2022, 9:19:54 AM12/8/22
to
TL;DR: Ich persönlich sehe das nicht ganz so kritisch. ;-)

On 2022-12-08 12:01, Stefan Ram wrote:
> Im Usenet gelten 72 Zeichen als Obergrenze für Zeilenlängen.
> Meiner Meinung nach sollte diese Grenze auch für Betreffe gelten.
> Obiger Betreff sieht so aus:
>
> [Python-de] regex: Ausdruck matches wen auf einer Zeile, fails when "freespacing"
>
> (ca. 82 Zeichen), in manchen (älteren) Newsreadern sogar:
>
> Re: =?utf-8?q?=5BPython-de=5D_regex=3A_Ausdruck_matches_wen_auf_einer_Zeile=2C_fails_when_=22freespacing=22?=

Das ist die kodierte Version, die nicht zur Anzeige bestimmt ist.
Und ich denke, ein E-Mail- oder News-Reader (selbst "ältere")
sollte das dekodieren können.

> Mit seiner Mischung aus Englisch und Deutsch sowie "wen" ist
> der Betreff auch nicht gerade eine Glanzleistung seines Autors.

Flüchtigkeitsfehler können jedem passieren.

> Man hätte beispielsweise
>
> Aufteilung eines regulaeren Ausdrucks
>
> als Betreff verwenden können.

Das ist halt immer die Abwägung zwischen Aussagekraft und
Kompaktheit. Beides sind sinnvolle Kriterien, die sich aber
mitunter widersprechen.

Viele Grüße
Stefan

Peter J. Holzer

unread,
Dec 8, 2022, 4:46:48 PM12/8/22
to
On 2022-12-08 14:07, Stefan Schwarzer <sschw...@sschwarzer.net> wrote:
> On 2022-12-08 08:20, robert rottermann wrote:
>> Ich habe eine regular Expression um Sektionen in einem ini-File zu filtern.
>>
>> Dieser Ausdruck funktioniert wenn er auf eine Zeile geschrieben wird. Also:
>>
>> sp0 = '^\[[^\]\r\n]+](?:\r?\n(?:[^\[r\n].*)?)*'
>>
>> Nicht aber wenn er "free spacing" geschrieben ist:
>>
>> [...]
>
>> Muss ich noch irgend ein Flag setzen?
>
> Du möchtest vermutlich `re.VERBOSE`:
> https://docs.python.org/3/library/re.html#re.VERBOSE

hat er ja:

Matthias Urlichs

unread,
Dec 9, 2022, 11:58:20 AM12/9/22
to
On 08.12.22 09:04, Christopher Arndt wrote:
> c) Regular expressions sind für so was nur bedingt geeignet, besser
> wäre es einen Parser zu definieren, z.B. mit PyParsing:

(d) für .INI-Dateien gibt es doch eh schon ein Standard-Modul …?

--
-- mit freundlichen Grüßen
--
-- Matthias Urlichs

OpenPGP_signature
Reply all
Reply to author
Forward
0 new messages