re.search
nur finden s das erste, was dem Muster entspricht, sucht es nicht nach weiteren Übereinstimmungen, wenn es einmal gefunden wurde. Sie erhalten ('six ', 'six')
, weil Sie eine Erfassungsgruppe in einem anderen verschachtelt haben; Die 'six '
entspricht der äußeren Gruppe und die 'six'
(ohne Leerzeichen) entspricht der inneren Gruppe.
Sie können tun, was Sie wollen, indem Sie zwei nicht verschachtelte Capture-Gruppen in einigen Nicht-Capture-Gruppen verwenden, die die (?:...)
-Syntax verwenden.
import re
r = "the (?:(?:(sixty)|(six))[ -]+)+items"
s = "the sixty six items"
m = re.search(r, s)
if m:
print(m.groups())
Ausgang
('sixty', 'six')
Dieses ein Tupel von zwei Elementen zurückgibt, weil wir zwei Capture-Gruppen im Muster haben.
Hier ist eine längere Demo.
import re
pat = re.compile("the (?:(?:(sixty)|(six))[ -]+)+items")
data = (
"the items",
"the six items",
"the six six items",
"the sixty items",
"the six sixty items",
"the sixty six items",
"the sixty-six items",
"the six sixty sixty items",
)
for s in data:
m = pat.search(s)
print('{!r} -> {}'.format(s, m.groups() if m else None))
Ausgang
'the items' -> None
'the six items' -> (None, 'six')
'the six six items' -> (None, 'six')
'the sixty items' -> ('sixty', None)
'the six sixty items' -> ('sixty', 'six')
'the sixty six items' -> ('sixty', 'six')
'the sixty-six items' -> ('sixty', 'six')
'the six sixty sixty items' -> ('sixty', 'six')
'es nie auf "sechs sechs"' angepasst haben könnte ... ja es kann, '(sechzig | sechs)' bedeutet Spiel 'sixty' _or_' sechs '. –
@TimBiegeleisen Falsch, denn wenn sie nacheinander aufeinander abgestimmt werden müssen, wo wird die "ty" im Sechs-Sechs-Fall abgeglichen? – PascalVKooten