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+''
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ń.
''(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).
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/
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 ?
czemu nie zrobiono tego w wyrażeniach regularnych ?
-> wyrażenia regularne są do parsowania języków regularnych a nie bezkontekstowych
; poczytaj linki, jakie dostałeś (http://kompilatory.agh.edu.pl/) to zrozumiesz
@Shalom @spartanPAGE @LukeJL Ach już trochę rozumiem, ale jeszcze muszę więcej doczytać by zamknąć temat. Naprwdę wyleczyliście mnie z depresji :)
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.
W moim środowisku
nikt po angielsku nie mówi oprucz mijego przyszywanego dziadka z australii :)