(in einer Zeile geschrieben) sollte es sein, wobei ich dazusagen muss, dass python nicht wirklich mein Gebiet ist ;)
In der 2. Zeile wird geprüft, ob nach beliebig vielen Zahlen ein Buchstabe vorkommt. In der 3. Zeile wird das Gleiche andersrum versucht. Erst danach wird auch wirklich das Wort ausgewählt.
Damit werden allerdings keine Umlaute erfasst. Einfach umstellen auf
\w
geht aber nur, wenn "character class subtraction" verfügbar ist. Damit könnte man z.B.
\b (?=\d*[\w-[\d]]) (?=[\w-[\d]]*\d) \w+\b
verwenden.
\w
gibt auch "_" als Treffer aus. Wenn das schon zuviel am Wort ist, muss dies entweder mit "character class subtraction" entfernt werden, also
[\w-[_]]
oder das Zeichen darf erst gar nicht in der Klasse auftauchen, also überall z.B.
[a-zA-ZÄÖÜäöüß]
statt
\w
Dann wird's aber unübersichtlich und die LOCALE-Einstellungen hat man schön umgangen, was hoffentlich nicht Sinn der Übung ist ;)
Falls character class subtraction nicht verfügbar ist, gibt's eventuell auch noch eine andere Möglichkeit, nur Buchstaben (LOCALE-abhängig) auszuwählen (vielleicht. die POSIX-Klasse [:alpha:] ?).