Regex - pomocy

NO
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:25
0

Witam, zacząłem ostatnio bawić się Regexem i mam pewien problem.

Jak wyciągnąć z tego samo ' km²' za pomocą re.search?
"Według danych z roku 2002[5] gmina Wiskitki ma obszar 150,94 km², w tym:

Jak wyciągać liczbę% po wybranym wyrazie za pomocą re.search?
"użytki rolne: 72%
użytki leśne: 20%"

nullpt4
  • Rejestracja:prawie 6 lat
  • Ostatnio:6 miesięcy
  • Postów:103
0

ja bym to zrobił tak

Kopiuj
>> p = re.findall("([0-9]+) km²", "123132 km²")
>>> print(p)
['123132']



>>> p = re.findall("([0-9]+)%", "cos 72%")
>>> print(p)
['72']

Możesz poczytać więcej o (grupach) w regexie tutaj
https://docs.python.org/3/howto/regex.html#grouping

edytowany 1x, ostatnio: nullpt4
NO
r'\d{1,}[,]\d{1,}\s...' wyszukuje mi 150,94 km². Wie Pan może czy się da w jakiś sposób zignorować cześć "wyszukania" i wybrać tylko km2?
nullpt4
w taki -> re.findall("km²", "123132 km²")
Althorion
Moderator C/C++
  • Rejestracja:prawie 10 lat
  • Ostatnio:około godziny
  • Postów:1605
1

Wie Pan może czy się w jakiś sposób zignorować cześć "wyszukania" i wybrać tylko km2?

Znaczy chcesz mieć wyrażenie regularne, które łapie tylko km²? To to będzie wyrażenie "km²". Jeśli nie, i nie chodzi Ci o rozwiązanie podane przez nullpt4 (a chyba nie, bo u niego pod postem to komentowałeś…), to o co? Jaką chcesz mieć odpowiedź do podanych przez Ciebie stringów?

NO
Chciałbym wyrażenie z wykorzystaniem search, które z tego 'Według danych z roku 2002[5] gmina Wiskitki ma obszar 150,94 km², w tym:' wybierze tylko "km2".
Althorion
Odpowiadaj proszę w odpowiedziach, nie w komentarzach. Ale tak, wyrażeniem regularnym, które złapie tylko km² jest wyrażenie km² — i tak samo dla dowolnego stałego, z góry znanego ciągu znaków.
NO
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:25
0

Rozwiązanie Pana nullpt nie sprawdzi się, ponieważ gdy będzie inna jednostka już będzie problem. Stała zawsze będzie liczba z przecinkiem, a ja chciałbym jednostkę, która jest obok i składa się z 2 lub 3 znaków.

K5
Rozwiązanie Pana nullpt było dobre ale dostosowane do twoich okrojonych wymagań, których nie przekazałeś nam w całości. Następnym razem napisz, że potrzebujesz jednostkę, a nie konkretnie 'km ^2'.
NO
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:25
0

"użytki rolne: 72%
"użytki leśne: 20%"

Jeżeli mój scrapper odpalę na inną gminę to liczby będą już inne, ale zgadzać się zawsze będzie "rolne" i "leśne". Chciałbym żeby pobierało mi liczbę i jednostkę po danym słowie.

Althorion
Moderator C/C++
  • Rejestracja:prawie 10 lat
  • Ostatnio:około godziny
  • Postów:1605
0

O, i teraz można zrozumieć, o co pytasz — chcesz mieć dwu- lub trzyznakowy ciąg, który występuje po ułamku dziesiętnym.

Zatem: \d+,\d (.{2,3}) Ewentualnie \d+,?\d (.{2,3}), jeśli przecinek jest opcjonalny.

edytowany 1x, ostatnio: Althorion
NO
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:25
0

Niestety nie działa.

screenshot-20200904154557.png

NO
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:25
0

A w poprawionym jest niestety 94 km2.

screenshot-20200904154704.png

Althorion
Moderator C/C++
  • Rejestracja:prawie 10 lat
  • Ostatnio:około godziny
  • Postów:1605
0

A dla wyrażenia łapiącego po rolne: albo leśne:, to będzie: (rolne|leśne): (\d+)% (i bierzesz tylko drugą grupę). Ew. (rolne|leśne): (\d+%), jeśli chcesz łapać też symbol pierwiastka.

NO
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:25
0

Podpowie Pan jak wybrać daną grupę? :)

Althorion
Moderator C/C++
  • Rejestracja:prawie 10 lat
  • Ostatnio:około godziny
  • Postów:1605
1

Faktycznie — problemem jest to, że masz po tej jednostce przecinek (więc nie jest już ona dwu- lub trzyznakowym ciągiem znaków). Można dopisać \W, żeby go połknąć, co ostatecznie tworzy: \d+,\d+ (.{2,3})\W? lub \d+,?\d+ (.{2,3})\W?.

edytowany 1x, ostatnio: Althorion
Althorion
Moderator C/C++
  • Rejestracja:prawie 10 lat
  • Ostatnio:około godziny
  • Postów:1605
0
NO
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:25
0

Wszystko pięknie działa! Dziękuje bardzo i życzę udanego weekendu!

edytowany 2x, ostatnio: nowynowynowy
lion137
Jak działa, to zaakceptuj odpowiedź.

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.