2015-11-15 10 views
5

Próbuję użyć Pythona RegEx re.sub, aby usunąć dwukropek przed przedostatnią samogłoską [aeiou] słowa, jeśli samogłoskę poprzedzającą (od końca) poprzedza inna samogłoska.Python RegEx za pomocą re.sub z wieloma wzorami

Tak więc okrężnica musi znajdować się pomiędzy trzecią a czwartą samogłoską, licząc od końca słowa.

Tak więc podany pierwszy przykład rozłożyłby się tak: w4:32ny1h.

we:aanyoh > weaanyoh # w4:32ny1h 
hiru:atghigu > hiruatghigu 
yo:ubeki > youbeki 

Poniżej znajduje się wyrażenie RegEx, którego próbuję użyć, ale nie mogę go uruchomić.

word = re.sub(ur"([aeiou]):([aeiou])(([^aeiou])*([aeiou])*([aeiou])([^aeiou])*([aeiou]))$", ur'\1\2\3\4', word) 
+0

Więc w zasadzie szukać dwóch samogłosek połączonych dwukropkiem? – Ionut

+0

dwukropek musi znajdować się pomiędzy trzecią a czwartą samogłoską, licząc od końca słowa. więc pierwszy podany przykład rozbiłby się tak jak w4: 32ny1h. – user2743

+0

Miło sprecyzować :) pomyśl o tym po odszyfrowaniu wzorca :) – Ionut

Odpowiedz

0

To powinno działać z tym:

word = re.sub(ur"(?<=[aeiou]):(?=[aeiou]([^aeiou]*[aeiou]){2}[^aeiou]*$)", ur'', word) 

patrz przykład tutaj: https://regex101.com/r/kA8xH3/2

informuje, że ja tylko uchwycić ten dwukropek i zastąpić go pustym ciągiem zamiast przechwytywania grup i złączyć je .

Tt sprawdza kombinację dwukropków, następnie sprawdza wcześniej, czy są 2 dodatkowe samogłoski (a może spółgłoski). To allso umożliwia dodatkowe spółgłoski na końcu, ale zapewnia, że ​​nie ma więcej samogłoska przez $

+1

[^ aeiou] * $ gwiazda mówi, że może wynosić 0 lub więcej, więc może kończyć się 0 spółgłoskami, co oznacza samogłoska – Alexander

+0

to nie powiedzie się, jeśli jest miejsce lub inna postać :) Po prostu staram się uzyskać nawet lol – Ionut

+0

@lonut Gdzie? Używam '[^ aeiou]', więc druga powinna zawierać spacje i znaki specjalne, czyż nie? A jeśli moje, to równie dobrze, prawda? ;) – Alexander

1

po prostu nie mają zbyt wiele nawiasów (i inne dodatkowe rzeczy) ?:

word = re.sub(ur"([aeiou]):(([aeiou][^aeiou]*){3})$", ur'\1\2', word) 
+0

To nie sprawi, że pierwszy znak po dwukropku będzie samogłoską, zobacz moją odpowiedź. – Ionut

+0

'[^ aeiou]' dopasowuje spacje, linie, inne dwukropki i znaki interpunkcyjne. – dawg

0

Ta wola zrobić:

word = re.sub(ur"([aeiou]):([aeiou])([^\Waeiou]*[aeiou][^\Waeiou]*[aeiou][^\Waeiou]*)$", ur'\1\2\3', word) 

http://www.phpliveregex.com/p/dCa

+0

która nie zadziała. W wyrażeniu muszą znajdować się 2 samogłoski po dwukropku, co oznacza, że ​​drugi i trzeci przykład nie zostaną przechwycone – Alexander

+0

tak, widziałem to. Ale masz '([aeiou]): ([aeiou]) (([aeiou]', które mówi, że muszą być 3 samogłoski w rzędzie, z 1. i 2. mającymi dwukropek między nimi – Alexander

+0

yep i co jest między ': ([aeiou])' i '(([aeiou] [^ aeiou] *) {2})'? nie ma innej spółgłoski dozwolone, więc coś jak 'dsa: adaa' nie byłoby dozwolone – Alexander

1

Nie wiesz, jeśli chcesz całkowicie ignorować spółgłoski; to regex będzie. W przeciwnym razie podobny do Jeffa.

import re 

tests = [ 
    'we:aanyoh', 
    'hiru:atghigu', 
    'yo:ubeki', 
    'yo:ubekiki', 
    'yo:ubek' 
] 

for word in tests: 
    s = re.sub(r'([^aeiou]*[aeiou][^aeiou]*):((?:[^aeiou]*[aeiou]){3}[^aeiou]*)$', r'\1\2', word) 
    print '{} > {}'.format(word, s) 
+0

'[^ aeiou]' dopasowuje spacje, line feeds, inne dwukropki i interpunkcje – dawg

1

stanu, które są kierowane na słowo versus linii, więc pierwszy zestaw kotew do tylko do czynienia ze słowami:

\b[regex will go here]\b 
^     ^ assert a word boundary 

Następny, dwukropkiem poprzedzone a następnie przez [aeiou] z dwóch więcej [aeiou] w części następującej po dwukropku. Zakładam, że sprawa jest niezależna?

(?i)(\b\w+[aeiou]):((?:[aeiou][^aeiou\s\W]*){3}\b) 
           ^match a character that is NOT vowel, space or not a 
             ^ \W=[^a-zA-Z0-9_] 

Demo

(Uwaga wykorzystania [^aeiou\W] które jest zgodne z liter, cyfr oraz _, ale nie inne postacie Demo.)

Python Demo:

import re 

tests={ 
    'matches':[ 
     'we:aanyoh', 
     'hiru:atghigu', 
     'yo:ubeki' 
     ], 
    'no match':[ 
     'wz:ubeki', 
     'we:a anyoh', 
     'yo:ubek', 
     'hiru:atghiguu' 
    ]  
} 

for k, v in tests.items(): 
    print k 
    for e in v: 
     s=re.sub(r'(?i)(\b\w+[aeiou]):((?:[aeiou][^aeiou\s\W]*){3}\b)', r'\1\2', e) 
     print '\t{} > {}'.format(e, s) 

Wydruki:

matches 
    we:aanyoh > weaanyoh 
    hiru:atghigu > hiruatghigu 
    yo:ubeki > youbeki 
no match 
    wz:ubeki > wz:ubeki 
    we:a anyoh > we:a anyoh 
    yo:ubek > yo:ubek 
    hiru:atghiguu > hire:atghiguu 

To będzie obsługiwać tylko wyrazy z jednym dwukropkiem.Jeśli chcesz dopasować słowa, które mają wiele dwukropków, ale mają ten sam wzór, zmień wzór LH tak, aby zawierał klasę znaków zawierającą dwukropek i kotwicę, która nie jest \b.

przykład: (?i)(^[\w:]+[aeiou]):((?:[aeiou][^aeiou\s\W]*){3}\b)

-1

Roundup (I stosuje samogłoskę inwestycyjne, aby wskazać, gdzie w słowie zastąpienie powinno nastąpić). Daj mi znać, jeśli chcesz, żebym dodał inne ciągi testowe.

import re 

strings = [ 
    'wE:aanyoh', 
    'hirU:atghigu', 
    'yO:ubeki', 

    'xE:aaa', 
    'xx:aaa', 
    'xa:aaaxA:aaa', 
    'xa:aaaxA:aaaxx', 
    'xa:aaaxA:aaxax', 
    'a:aaaxA:aaxax', 
    'e:aeixA:aexix', 
] 


pattern = r""" 
    (
     .* 
     [aeiou] 
    ) 
    : 
    (
     [aeiou] 
     .*? 
     [aeiou] 
     .*? 
     [aeiou] 
    ) 
""" 

template = "{:>15}: {}" 
for string in strings: 
    print(
     template.format('original', string) 
    ) 

    print(template.format('Alexander:', 
     re.sub(ur"(?<=[aeiou]):(?=[aeiou]([^aeiou]*[aeiou]){2}[^aeiou]*$)", ur'', string, flags=re.I) 
    )) 

    print(template.format('lonut:', 
     re.sub(ur"([aeiou]):([aeiou])([^\Waeiou]*[aeiou][^\Waeiou]*[aeiou][^\Waeiou]*)$", ur'\1\2\3', string, flags=re.I) 
    )) 

    print(template.format('Tom Zych:', 
     re.sub(r'([^aeiou]*[aeiou][^aeiou]*):((?:[^aeiou]*[aeiou]){3}[^aeiou]*)$', r'\1\2', string, flags=re.I) 
    )) 

    print(template.format('Jeff Y:', 
     re.sub(ur"([aeiou]):(([aeiou][^aeiou]*){3})$", ur'\1\2', string, flags=re.I) 
    )) 

    print(template.format('7stud:', 
     re.sub(pattern, r'\1\2', string, count=1, flags=re.X|re.I) 
    )) 

    print("\n") 

 original: wE:aanyoh 
    Alexander:: wEaanyoh 
     lonut:: wEaanyoh 
     Tom Zych:: wEaanyoh 
     Jeff Y:: wEaanyoh 
     7stud:: wEaanyoh 


     original: hirU:atghigu 
    Alexander:: hirUatghigu 
     lonut:: hirUatghigu 
     Tom Zych:: hirUatghigu 
     Jeff Y:: hirUatghigu 
     7stud:: hirUatghigu 


     original: yO:ubeki 
    Alexander:: yOubeki 
     lonut:: yOubeki 
     Tom Zych:: yOubeki 
     Jeff Y:: yOubeki 
     7stud:: yOubeki 


     original: xE:aaa 
    Alexander:: xEaaa 
     lonut:: xEaaa 
     Tom Zych:: xEaaa 
     Jeff Y:: xEaaa 
     7stud:: xEaaa 


     original: xx:aaa 
    Alexander:: xx:aaa 
     lonut:: xx:aaa 
     Tom Zych:: xx:aaa 
     Jeff Y:: xx:aaa 
     7stud:: xx:aaa 


     original: xa:aaaxA:aaa 
    Alexander:: xa:aaaxAaaa 
     lonut:: xa:aaaxAaaa 
     Tom Zych:: xa:aaaxAaaa 
     Jeff Y:: xa:aaaxAaaa 
     7stud:: xa:aaaxAaaa 


     original: xa:aaaxA:aaaxx 
    Alexander:: xa:aaaxAaaaxx 
     lonut:: xa:aaaxAaaaxx 
     Tom Zych:: xa:aaaxAaaaxx 
     Jeff Y:: xa:aaaxAaaaxx 
     7stud:: xa:aaaxAaaaxx 


     original: xa:aaaxA:aaxax 
    Alexander:: xa:aaaxAaaxax 
     lonut:: xa:aaaxAaaxax 
     Tom Zych:: xa:aaaxAaaxax 
     Jeff Y:: xa:aaaxAaaxax 
     7stud:: xa:aaaxAaaxax 


     original: a:aaaxA:aaxax 
    Alexander:: a:aaaxAaaxax 
     lonut:: a:aaaxAaaxax 
     Tom Zych:: a:aaaxAaaxax 
     Jeff Y:: a:aaaxAaaxax 
     7stud:: a:aaaxAaaxax 


     original: e:aeixA:aexix 
    Alexander:: e:aeixAaexix 
     lonut:: e:aeixAaexix 
     Tom Zych:: e:aeixAaexix 
     Jeff Y:: e:aeixAaexix 
     7stud:: e:aeixAaexix 
+0

w twoim wzorze - '[aeiou]. *? [Aeiou]. *? [Aeiou]' - samogłoska po Czy to nie pozwoli na setki samogłosek? Twoje przypadki testowe zdają się sprawdzać tylko przypadki, w których po dwukropku są dokładnie trzy samogłoski – TessellatingHeckler

+0

@TessellatingHeckler, Yep. :( – 7stud

+0

Nie rozumiem, dlaczego ty "Porównując inne odpowiedzi. Czy mógłbyś wyjaśnić, jaka jest różnica?" – Mariano

Powiązane problemy