Załóżmy, że mamy ciąg: „This is an example.It does not contain space after one sentence.” I pasujący wzorzec: „(\.|,|:|;|!|\)|\])(\s*)([a-zA-Z]*)” Ten wzorzec pasuje do dowolnej kombinacji, w której po interpunkcji nie ma spacji lub więcej niż jedna dostępna spacja. Jeśli którykolwiek z tych warunków jest spełniony, zastępuje pojedynczą spację znakiem \1 \3. Wynik tego będzie: This is an example. It does not contain space after one sentence. (zastąpiony spacją)

Moje pytanie brzmi: jak wiemy, .It to nasz dopasowany ciąg i jego pozycja indeksu. Ale jak możemy pobrać to, co dokładnie podstawiono na swoim miejscu? Chcę pobrać to . It (kropka spacja It).

Uwaga: należy również wziąć pod uwagę przypadek wielu dopasowań w jednej linii.

Edytuj:

Dane wejściowe: This is text.Another text.Next case

Wynik: [". Another", ". Next"]

0
Tanmay Bairagi 1 wrzesień 2020, 15:47

2 odpowiedzi

Najlepsza odpowiedź

Użyj poniższego wyrażenia regularnego

.*?(\.)\s*(\w*)\s

Kod

import re
a="This is text.Another text.Next case"
print([i+" "+j for (i,j) in re.findall(".*?(\.)\s*(\w*)\s",a)])

Wyjście

['. Another', '. Next']
1
Liju 1 wrzesień 2020, 15:45

Możesz skrócić alternację wymieniającą wszystkie pojedyncze znaki do klasy znaków [.,:;!)|\]], aby dopasować jeden z wymienionych znaków.

Możesz pominąć grupę wokół (\s*), ponieważ zostanie ona zastąpiona pojedynczą spacją, dzięki czemu będziesz mieć 2 grupy przechwytywania zamiast 3.

Jeśli powinien być co najmniej jeden następujący znak, możesz użyć + jako kwantyfikatora. Jeśli użyjesz gwiazdki, będzie pasować 0+ razy. Jeśli na końcu ciągu znajduje się kropka bez niczego po niej, po prostu dodasz spację na końcu ciągu.

([.,:;!)|\]])\s*([a-zA-Z]+)

Demo Regex | Demo Pythona

Aby zobaczyć, jaka będzie zastępowana wartość, możesz połączyć grupę 1 i grupę 2 z odstępem między nimi. re.findall zwróci listę krotek zawierających wartość grupy 1 i grupy 2.

Na przykład

import re

regex = r"([.,:;!)|\]])\s*([a-zA-Z]+)"
s = "This is text.Another text.Next case"
print(list(map(lambda x: f"{x[0]} {x[1]}", re.findall(regex, s))))

Wynik

['. Another', '. Next']
1
The fourth bird 1 wrzesień 2020, 19:39