Wyrażenia regularne, import re

Wyrażenia regularne, import re
AdaKo
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 4 lata
  • Postów:38
0

Witam. Mam pewne zadanie, gdzie muszę z tekstu wyciągnąć inicjały i nazwiska odkrywców. Zrobiłem tyle i nie wiem czemu nic mi nie wyświetla:

planetoidy = '''(1) Ceres 2,7653 1 stycznia 1801 G. Piazzi
(2) Pallas 2,7722 28 marca 1802 H. W. Olbers
(3) Juno 2,6701 1 września 1804 K. Harding
(4) Westa 2,3619 29 marca 1807 H. W. Olbers
(5) Astraea 2,5771 8 grudnia 1845 K. L. Hencke
(6) Hebe 2,4256 1 lipca 1847 K. L. Hencke
(7) Iris 2,3856 13 sierpnia 1847 J. R. Hind'''

Kopiuj
 import re

for odkrywca in re.finditer(r'\[A-Z]\$',planetoidy):
    print(odkrywca.group()) ```
edytowany 1x, ostatnio: AdaKo
MA
  • Rejestracja:prawie 17 lat
  • Ostatnio:17 dni
  • Postów:644
1

https://regex101.com/r/l62gFv/1

możesz się bawić na żywo, po prawej jest wszystko wyjaśnione, na dole po prawej masz docs.

edytowany 1x, ostatnio: Markuz
AdaKo
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 4 lata
  • Postów:38
0

A jak mógłbym wywołać te pierwsze litery? Chodzi mi o te inicjały, jeśli [A-Z] nie działa to w jaki sposób?

AdaKo
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 4 lata
  • Postów:38
0

Mam coś takiego

Kopiuj
r'\w?[A-Z].\s.+'

Chyba nie jest najoptymalniejsza no ale jest XD

PerlMonk
Zapis .+ trochę razi, ale przynajmniej to już jakiś punkt wyjścia do dalszej pracy.
AdaKo
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 4 lata
  • Postów:38
0

Mam jeszcze takie pytanie. Jakbym chciał złączyć te dwie rzeczy np. Inicjały z nazwiskami i do tego te liczby 2,7.... itd. to jak mógłbym to zrobić?

(1) Ceres 2,7653 1 stycznia 1801 G. Piazzi ===> 2,7653 G. Piazzi

Chodzi mi o coś takiego

edytowany 1x, ostatnio: AdaKo
AF
  • Rejestracja:prawie 7 lat
  • Ostatnio:10 dni
  • Postów:172
2

A tak na marginesie, czy to musi być koniecznie regex? Bo jeżeli masz tak powtarzalny format danych to spróbowałbym pomóc sobie Pythonem. Np. :

Kopiuj
for line in planetoidy:
   columns = line.split()
   return f'{columns[2]} {columns[6]} {columns[7]}'

Wtedy problem staje się trywialny.

A liczby w regexie możesz wyłapać tak:

Kopiuj
([0-9]+,?[0-9]*)

Żeby nie wyłapać też () możesz dodać spacje wokół albo zrobić look behind:

Kopiuj
 ([0-9]+,?[0-9]*) 
Kopiuj
(?<=\([0-9]\))([0-9]+,?[0-9]*)
AdaKo
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 4 lata
  • Postów:38
0

Nie musi być tylko myslałem że mogę zrobić coś w stylu 'r( "jeden przykład" + "drugi przykład", blabla) no ale jak się tak nie da no to trudno. Dzięki wszystkim za pomoc :)

AF
  • Rejestracja:prawie 7 lat
  • Ostatnio:10 dni
  • Postów:172
0

Da się - po to masz capturing i non capturing groups. Możesz składać w regexie bardziej skomplikowane wyrażenia. Np

(wyrażenie) (:?non capturing group) (wyrażenie2)
Zwróci Ci grupy 1,2 i ogólna gdzie leci to czego nie przechwyciles w innych grupach

AdaKo
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 4 lata
  • Postów:38
0

Aha. No dobra. To poczytam jeszcze coś o tym w necie. Wielkie dzięki :D

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.