Seite 1 von 1

Strings aus einem regulären Ausdruck generieren?

Verfasst: Dienstag 19. April 2011, 20:18
von Dingels
Schönen guten Abend,

da meine Suche bisher erfolglos blieb, möchte ich euch mal fragen: Gibt es ein Python-Modul, das es ermöglicht, Strings aus einem regulären Ausdruck zu generieren? Also z.B. sowas:

Code: Alles auswählen

>>> generate_string('talk(?:ing|ed|s)?')
['talk', 'talking', 'talked', 'talks']
Das funktioniert natürlich nur für diejenigen regulären Ausdrücke, die nicht unendlich viele Strings beschreiben. Gibt's sowas? Ich vermute, ohne endliche Automaten lässt sich das nicht bewerkstelligen, oder?

Wofür ich das brauche? Nun, ich würde mir gerne einen kleinen Web Crawler mittels der urllib-Bibliothek basteln, der in der Lage ist, all diejenigen Websites zu durchforsten, deren URLs einem bestimmten Schema entsprechen, welches ich mit einem regulären Ausdruck vorgebe. Das scheint mit der Standardbib noch nicht möglich zu sein.

Könnt ihr mir da weiterhelfen? Herzlichen Dank! :)

Re: Strings aus einem regulären Ausdruck generieren?

Verfasst: Dienstag 19. April 2011, 20:53
von BlackJack
@Dingels: Man könnte recht einfach eine Funktion schreiben die aus einer Vorlage und einer Liste mit Alternativen die Zeichenketten erzeugt:

Code: Alles auswählen

from itertools import product


def iter_variations(template, alternatives):
    return (template % values for values in product(*alternatives))


def main():
    for string in iter_variations(
        'Ich zeichne %s %s.', [['rote', 'gelbe', 'lila'], ['Kreise', 'Punkte']]
    ):
        print string


if __name__ == '__main__':
    main()
Da liesse sich sicher auch ein Parser schreiben der etwas re-ähnliches entsprechend aufbereitet.

Wenn die Alternativen auch verschachtelt sein dürfen, wird es natürlich etwas komplizierter.