Jeśli mam słowo india

MECZE "india!" "india!" "india." "india"

BRAK MECZÓW "indian" "indiana"

Zasadniczo chcę dopasować ciąg, ale nie wtedy, gdy jest on zawarty w innym ciągu.

Po przeprowadzeniu pewnych badań zacząłem od

exp = "(?<!\S)india(?!\S)" num_matches = len(re.findall(exp))

Ale to nie pasuje do interpunkcji i nie jestem pewien, gdzie to dodać.

1
sy89 3 kwiecień 2020, 20:56

6 odpowiedzi

Najlepsza odpowiedź

Zakładając, że celem jest dopasowanie danego słowa (np. "india") w ciągu, pod warunkiem, że słowo nie jest poprzedzone ani zakończone znakiem, którego nie ma w ciągu " .,?!;", można użyć następującego wyrażenia regularnego:

(?<![^ .,?!;])india(?![^ .,?!;\r\n])

Próbny

Silnik wyrażeń regularnych Pythona wykonuje następujące operacje

(?<!             # begin a negative lookbehind
  [^ .,?!;]      # match 1 char other than those in " .,?!;"
)                # end the negative lookbehind
india            # match string
(?!              # begin a negative lookahead   
  [^ .,?!;\r\n]  # match 1 char other than those in " .,?!;\r\n"
)                # end the negative lookahead

Zwróć uwagę, że klasa znaku w ujemnym lookahead zawiera \r i \n w przypadku, gdy india znajduje się na końcu wiersza.

2
Cary Swoveland 3 kwiecień 2020, 20:27

Spróbuj tego ^india[^a-zA-Z0-9]$

^ - Regex zaczyna się w Indiach

[^a-zA-Z0-9] - nie a-z, A-Z, 0-9

$ - End Regex

1
Rupak 3 kwiecień 2020, 18:10

Spróbuj z:

r'\bindia\W*\b'

Zobacz demo


Aby zignorować przypadek:

re.search(r'\bindia\W*\b', my_string, re.IGNORECASE).group(0)
1
yatu 3 kwiecień 2020, 18:11

Możesz użyć:

import re

s = "india."
s1 = "indiana"
print(re.search(r'\bindia[.!?]*\b', s))
print(re.search(r'\bindia[.!?]*\b', s1))

Wynik:

<re.Match object; span=(0, 5), match='india'>
None
1
kederrac 3 kwiecień 2020, 18:51

Jeśli chcesz również dopasować interpunkcję, możesz użyć zanegowanej klasy znaków gdzie możesz dopasować dowolny znak z wyjątkiem znaku słowa lub nowej linii.

(?<!\S)india[^\w\r\n]*(?!\S)
  • (?<!\S) Zaznacz białą granicę po lewej stronie
  • india Dopasuj dosłownie
  • [^\w\r\n] Dopasuj 0+ razy dowolny znak z wyjątkiem znaku słowa lub nowej linii
  • (?!\S) Zaznacz białą granicę po prawej stronie

Demo Regex

1
The fourth bird 4 kwiecień 2020, 16:44
\"india(\W*?)\" 

To złapie wszystko oprócz cyfr i liter

1
Ravyar Tahir 3 kwiecień 2020, 18:10