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 № 1Odpowiedz 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)