Jak w wyrażeniach regularnych zapisać że jakieś grupy mają być w byle jakiej kolejnośni ?
np:
''x=\d+
y=\d+''
by dało się też tak:
''y=\d+
x=\d+''
Jak w wyrażeniach regularnych zapisać że jakieś grupy mają być w byle jakiej kolejnośni ?
np:
''x=\d+
y=\d+''
by dało się też tak:
''y=\d+
x=\d+''
więcej konkretów.
IMO to jest jeden z tych przypadków, gdzie nie powinno się stosować wyrażeń regularnych.
import re
import sys
p = re.compile(r"(\w+)\s*=\s*(\d+)")
matches = p.findall(sys.stdin.read())
print('\n'.join(str(x) for x in matches))
In | Out |
---|
x=6 y=7
zimabwe=123
|
('x', '6')
('y', '7')
('zimabwe', '123')
Dobra to teraz kilka pytań co do samych danych:
Chyba strasznie skomplikowaliście. Niech to będzie zwykły *.txt ze wzorem np x=.*/ny=.*
i jak zmienić żeby było zamiennie. W XSD można było mieć xs:sequence
czyli w normalmej kolejności xs:choice
czyli jeden z elementów i xs:all
czyli elementy w dowolnej kolejności.
Jak napiseć taki wzór by było kilka grup i by mogły wystąpić tylko raz ale w dowolnej kolejości ?
Nie rozumiem. Nie możesz prostu przejść przez każdą linijkę i zastosować ogólnego wyrażenia regularnego w stylu(\w+) *= *(\d+)
?
A później zapisywać dane do jakiejś tablicy/mapy? (gdzie $1 byłaby nazwa zmiennej, a $2 przypisywana wartość)
Wyrażeń regularnych nie musisz stosować do całego dokumentu naraz (co jak widać nie zawsze się udaje), możesz połączyć iterację po linijkach/tokenach etc. z regexpami. Wtedy nie musi wiązać cię kolejność danych złapanych wyrażeń.
@LukeJL A jak by te Itemy się różniły ? NP gdyby to była składnia języka ?
Wyobraż sobie składnię tworzenia klasy...
IMO to jest bardzo ważne.
Po prostu nie chcę się z tym męczyć.
No to się da czy nie ? @LukeJL @Shalom
A co chcesz zrobić tak ogólnie? Jaki problem próbujesz rozwiązać? Nie napisałeś szerszego kontekstu, w którym pojawia się potrzeba użycia tych wyrażeń regularnych.
''(public)|(private)\sclass\s[A-Za-z0-9_-]+/s {
(public)|(private)\sclass\s[A-Za-z0-9_-]+/s {
VAR\s+[A-Za-z0-9_-]+=[A-Za-z0-9_-]+\n
proc/s[A-Za-z0-9_-]+
{
([A-Za-z0-9_-]+\s[A-Za-z0-9_-]+\n)*
}
\s*
(public)|(private)\sclass\s[A-Za-z0-9_-]+/s {
VAR\s+[A-Za-z0-9_-]+=[A-Za-z0-9_-]+/n
proc/s[A-Za-z0-9_-]+\s*
{
([A-Za-z0-9_-]+\s[A-Za-z0-9_-]+\n)*
}\s*
}\s*''
@LukeJL To tylko przykład ale chcę żeby mi się procedury klasy i zmienne mieszały i było ich nieskończone ilości. Przykład może na szybko ale w takich sytułacjach będę tego używał. Nie wiem czy to co napisałem nie ma błędów.
@Xix języki programowania z reguły są językami Bezkontekstowymi a nie Regularnymi i w związku z tym nie da sie ich poprawnie parsować za pomocą regexpów. Jak chcesz parsować język programowania to użyj jakiegoś generatora parserów SLR, LR, LL (np. Antlr czy bison).
Co ?! Jakimi ? Bezkontekstowymi ? Co to parsery ? Ja teraz z mojej książki wyczytałem wyrażnia regularne i jeśli się nie da to są dla mnie nie przydatne...
To co mam zrobić. W jakim to się języku pisze ?
To nie kwestia języka, tylko nieznajomości u ciebie pewnych podstaw informatyki. Zacznij może tutaj: http://wazniak.mimuw.edu.pl/index.php?title=J%C4%99zyki%2C_automaty_i_obliczenia albo tu http://infolab.stanford.edu/~ullman/ialc.html albo tu: http://kompilatory.agh.edu.pl/
@Shalom Czego dokładnie nie wiem ? W mojej książce nic takiego nie ma. Czyli wyrażenia regularne dadzą radę jak się czegoś poducze ?
Nie bo wyrażenia regularne są do parsowania języków regularnych a nie bezkontekstowych. Jakieś proste powtarzalne konstrukcje można tak przetwarzać, ale dowolnego kodu w javie już nie.
@Shalom To czego użyć i czemu nie zrobiono tego w wyrażeniach regularnych ?
@Shalom @spartanPAGE @LukeJL Ach już trochę rozumiem, ale jeszcze muszę więcej doczytać by zamknąć temat. Naprwdę wyleczyliście mnie z depresji :)