Regex

Odpowiedz Nowy wątek
2019-09-09 16:41
0

Witam forumowiczów.
Dostałe pewne zadanie. Mianowicie mam przekonwertować nazwy polskie na angielskie w pewnych plikach tekstowych.
Możliwych pól jest kilkaset.
Ponieważ nie chcę powtarzać tego samego kodu kilkaset razy dla każdej możliwej sytuacji postanowiłem zrobić to sprytniej za pomocą pętli.

text='tekst do konwersji'
listold=['Nazwa uzytkownika','UID Procesu']
listnew=['username','ProcessUID'']

index=0
regexlist=[]
for x in range(0,len(listold)):
        pattern = re.compile(listold[index]) #regex który wyszukuje np. 'Nazwa użytkownika'
        regex=pattern.sub(listnew[index],text) #podmiana nazwy użytkownika na 'username'
        regexlist.append(regex)
        index = index + 1

Wykombinowałem to w ten sposób i oczywiście nie działa.
Wypluwa mi listę dwu elementową, gdzie pod indeksem[0] jest zmieniona pierwsza wartość a pod indeksem[1] druga wartość ale nigdy obie wartości równocześnie.
Ktoś wie jak to to poprawnie zrobić- aby końcowym wynikiem były obie zmienione wartości z listy listnew?

edytowany 3x, ostatnio: William Wallace, 2019-09-09 16:42

Pozostało 580 znaków

2019-09-09 18:38
0

Napisz co dokładnie Chcesz zrobić, przekonwertować nazwy, w czym (I Popraw ten tytuł). Co Ci wypluwa, jaką listę? Jeśli chodzi o regexlist, to tutaj:
regex=pattern.sub(listnew[index],text)
regex to 'tekst do konwersji', i za każdym razem w pętli, zachodzi ta sama zmiana.


Pozostało 580 znaków

2019-09-10 10:16
2

Prawdę napisawszy nie bardzo mogę pojąć o co w tym chodzi.

Wypluwa mi listę dwu elementową, gdzie pod indeksem[0] jest zmieniona pierwsza wartość a pod indeksem[1] druga wartość ale nigdy obie wartości równocześnie.

Znaczy się - zmienia pierwszą, nie zmienia drugiej? Czy jakieś inne licho

regexlist=[]
for x in range(0,len(listold)):
 index = index + 1

Troszkę mi ten styl pisania nie pasuje

regexlist = list()
for x in range(len(listold)):
 index += 1

A tak przy okazji - nie dało by się tego słownikiem?
words= {eng1:pol1,eng2:pol2 }itd.
a potem zamieniać wedle klucza - nazwa angielska = słownik[nazwa angielska]

na przykład:

text = "Ala ma kota"
words = {"Ala":"Ola", "kota":"psa"}
new_text = " "
wl = text.split()
for i in range (len(wl)):
  if wl[i] in words:
    wl[i] =  words[wl[i]]
new_text = ' '.join(wl)

print(new_text)

Pozostało 580 znaków

2019-09-10 11:00
0
lion137 napisał(a):

Napisz co dokładnie Chcesz zrobić, przekonwertować nazwy, w czym (I Popraw ten tytuł). Co Ci wypluwa, jaką listę? Jeśli chodzi o regexlist, to tutaj:
regex=pattern.sub(listnew[index],text)
regex to 'tekst do konwersji', i za każdym razem w pętli, zachodzi ta sama zmiana.

Chcę to przekonwertować w pliku txt.
Sorka za tytuł, ale teraz nie jestem w stanie go zmienić, zapamiętam jak nadawać tytuły na przyszłość.

Pozostało 580 znaków

2019-09-10 11:18
0
Serechiel napisał(a):

Prawdę napisawszy nie bardzo mogę pojąć o co w tym chodzi.

Wypluwa mi listę dwu elementową, gdzie pod indeksem[0] jest zmieniona pierwsza wartość a pod indeksem[1] druga wartość ale nigdy obie wartości równocześnie.

Znaczy się - zmienia pierwszą, nie zmienia drugiej? Czy jakieś inne licho

regexlist=[]
for x in range(0,len(listold)):
 index = index + 1

Troszkę mi ten styl pisania nie pasuje

regexlist = list()
for x in range(len(listold)):
 index += 1

A tak przy okazji - nie dało by się tego słownikiem?
words= {eng1:pol1,eng2:pol2 }itd.
a potem zamieniać wedle klucza - nazwa angielska = słownik[nazwa angielska]

na przykład:

text = "Ala ma kota"
words = {"Ala":"Ola", "kota":"psa"}
new_text = " "
wl = text.split()
for i in range (len(wl)):
  if wl[i] in words:
    wl[i] =  words[wl[i]]
new_text = ' '.join(wl)

print(new_text)

1.Przykładowy log do zmiany:
text=' Nazwa pliku = /opt/clearance/manager/clearance.conf AND Nazwa procesu= /usr/bin/java'

  1. Muszę zamienić to na angielskie nazwy i uwalić 'spacje' czyli:
    text='filename=/opt/clearance/manager/clearance.conf AND targetprocessname= /usr/bin/java'

Nie będę pisał osobnego regexa dla każdego możliwego pola bo jest ich prawie 400-sta.
Chcę to zrobić w pętli.
Plan jest taki: zrobić dwie listy, jedna ze starymi nazwami pól, druga z nowymi:

text='Nazwa pliku = /opt/clearance/manager/clearance.conf AND  Nazwa procesu = /usr/bin/java'
listold=['Nazwa pliku','Nazwa procesu']
listnew=['filename','targetprocessname']

index=0

for x in range(0,len(listold)):
        pattern = re.compile(listold[index]) #regex który wyszukuje np. 'Nazwa użytkownika'
        regex=pattern.sub(listnew[index],text) #podmiana nazwy użytkownika na 'username'
        index = index + 1

print(regex) #Nazwa pliku = /opt/clearance/manager/clearance.conf AND  targetprocessname = /usr/bin/java

Zmienia mi tylko drugą wartość, pierwsza jest po staremu.
Staram się rozkminić jak to zapisać aby pierwsza i druga wartość były zmienione.

Pozostało 580 znaków

2019-09-10 11:54
0

Może czegoś nie zrozumiałem, ale wydaje się to trywialne przy użyciu string.replace[0]. Zastępujesz odpowiednie stare części nowymi:

text='Nazwa pliku = /opt/clearance/manager/clearance.conf AND  Nazwa procesu = /usr/bin/java Nazwa pliku = /usr Nazwa procesu ='

listold=['Nazwa pliku','Nazwa procesu']
listnew=['filename','targetprocessname']

limit = len(listnew)
i = 0

while i < limit: 
    text = text.replace(listold[i], listnew[i])
    i += 1 

print(text) # -> filename = /opt/clearance/manager/clearance.conf AND  targetprocessname = /usr/bin/java filename = /usr targetprocessname =

[0] https://docs.python.org/2/library/string.html#string.replace


Pozostało 580 znaków

2019-09-10 12:16
0
lion137 napisał(a):

Może czegoś nie zrozumiałem, ale wydaje się to trywialne przy użyciu string.replace[0]. Zastępujesz odpowiednie stare części nowymi:

text='Nazwa pliku = /opt/clearance/manager/clearance.conf AND  Nazwa procesu = /usr/bin/java Nazwa pliku = /usr Nazwa procesu ='

listold=['Nazwa pliku','Nazwa procesu']
listnew=['filename','targetprocessname']

limit = len(listnew)
i = 0

while i < limit: 
  text = text.replace(listold[i], listnew[i])
  i += 1 

print(text) # -> filename = /opt/clearance/manager/clearance.conf AND  targetprocessname = /usr/bin/java filename = /usr targetprocessname =

[0] https://docs.python.org/2/library/string.html#string.replace

Dzięki wielkie. Z użyciem string.replace() to rzeczywiście trywialne.
Działa :)

Pozostało 580 znaków

2019-09-10 19:23
0

Ale lepiej połącz to z listą:

words = {"Ala":"Ola", "kota":"psa"}

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0