/ / Używanie wyrażenia regularnego do wyszukiwania tekstu dla nazw krajów ze spacjami i bez nich - python, regex

Używanie regex do wyszukiwania tekstu dla nazw krajów, ze spacjami i bez spacji - python, regex

Korzystam z wyrażenia regularnego do przeszukiwaniablok tekstu, aby znaleźć wszystkie nazwy krajów w tekście. Jednak nazwa kraju może zawierać spacje, więc na przykład Anglia może być Wielka Brytania, Wielka Brytania, Wielka Brytania lub GB.

Jak dotąd proces, który do tej pory śledziłem, jest;

1) Najpierw wyeliminuj wszystkie słowa, które nie zaczynają się od dużej litery.

2) Następnie wyszukaj wszystkie małe litery poprzedzające to

Stworzyłem do tego podstawowe wyrażenie;

[A-Z][a-z]+

Działa to w krajach z jednym słowem na nazwę.

Jednak ponieważ chcę móc rejestrować nazwy krajów zawierające więcej niż jedno słowo. Następnie użyłem operatora potoku, aby móc dopasować wiele grup (|)

Proces jest teraz;

1) Wyeliminuj wszystkie małe litery, wyszukując w wyrażeniu regularnym tylko te słowa, które zaczynają się od dużej litery dla pierwszej litery. (Tak jak poprzednio)

2) Użyj operatora potoku, aby dopasować wiele grup;

2.1) Gdzie grupa 1 zostanie użyta do dopasowania jednej lub więcej małych liter poprzedzających pierwszą wielką literę. (tzn. będę mógł uzyskać nazwę kraju „Chiny”)

2.2) Gdzie grupa 2 zostanie użyta do dopasowania jednej lub więcej wielkich liter poprzedzających pierwszą wielką literę. (tzn. będę mógł uzyskać nazwę kraju „USA”)

2.3) Gdzie grupa 3 zostanie użyta do dopasowania wielu słów i spacji, w których słowa mogą zawierać duże litery (tj. Mogę uzyskać nazwę kraju „Papua Nowa Gwinea”)

Udało mi się osiągnąć pierwsze dwie grupy (2.1 i 2.2) za pomocą wyrażenia regularnego;

[A-Z]([a-z]+|[A-Z]+)

Jednak podczas próby osiągnięcia trzeciej grupy nie mogę uzyskać wyników za pomocą operatora potoku, ponieważ operator potoku pasuje do pierwszego zestawu grup (2.1).

Użyłem do tego wyrażenia regularnego;

[A-Z]([a-z]+|[A-Z]+|[a-zA-Zs]*)

Czy istnieje sposób sprawdzenia, czy wyrażenie regularne pasuje do wszystkich grup?

Tutaj jest połączyć do mojego wyrażenia regularnego.

Odpowiedzi:

0 dla odpowiedzi № 1

Odpowiedz zgodnie z komentarz.

Załóżmy, że masz listę wszystkich takich krajów:

countries = ["Russia", "USA", "United States of America", "Zimbabwe"]
# this should contain all the countries, I just show an example here

Następnie możesz to zrobić w następujący sposób:

indexes = [text.find(country) for country in countries]
found_contries = [(index, country) for index, country in zip(indexes, countries)
if index != -1]

W ten sposób tworzymy listę krotek (index, country) dla krajów faktycznie znalezionych w tekście (jeśli go nie znaleziono, text.find zwraca -1 i jest wykluczone z listy zgodnie z warunkiem if index != -1).

Zatem kraj, którego potrzebujesz, jest sprawiedliwy

min(found_contries)[1]

Na przykład let text = "lala lalala Zimbabwe lala USA". Następnie

indexes
[-1, 26, -1, 12]

found_contries
[(26, "USA"), (12, "Zimbabwe")]

min(found_contries)[1]
"Zimbabwe"

0 dla odpowiedzi nr 2

Edycja: Wysłałem następującą odpowiedź, zanim OP całkowicie zmienił swoje pytanie.

Możesz użyć binarnego wyrażenia regularnego OR operator (reprezentowany przez |), aby wyszukać jedną z listy nazw krajów i użyć operatora w nawiasach, aby umieścić dopasowania w „grupie”:

(.*(China|United Kingdom|England).*)*

Wewnętrzny .* przechwytuj dowolny tekst otaczający lub pomiędzy nazwami krajów. Zewnętrzne * powtórzy dopasowanie grupy, dopóki wszystkie nazwy krajów nie zostaną dopasowane.

Na strona, do której linkujesz, na przykład, będziesz odwoływał się tylko do dopasowań w kolorze zielonym (dopasowania „grupowe”), a nie do pełnych dopasowań.

Polecam to zrobić programowo. Zapętlasz listę nazw krajów i wyszukujesz je w ciągu wejściowym:

Przykład uproszczonego języka Python:

all_country_names = ["China", "United Kingdom", "England"]
found_country_names = []
input = "In China there is the great wall."
for name in all_country_names:
if name in input:
found_country_names.append(name)