Konkrečių simbolių pašalinimas iš eilutės naudojant "Python

Bandau pašalinti tam tikrus simbolius iš eilutės naudodamasis "Python". Dabar naudoju tokį kodą. Deja, atrodo, kad jis nieko nedaro su eilute.

for char in line:
    if char in " ?.!/;:":
        line.replace(char,'')

Kaip tai padaryti tinkamai?

Sprendimas

"Python" eilutės yra nepakeičiamos (jų negalima keisti). Dėl to line.replace(...) sukuria naują eilutę, o ne pakeičia senąją. Kad kintamasis įgytų naują reikšmę su pašalintais ženklais, reikia ją perpinti (priskirti) kintamajam line.

Be to, jūsų pasirinktas būdas bus gana lėtas. Taip pat tikėtina, kad tai šiek tiek suklaidins patyrusius pitonininkus, kurie, pamatę dvigubą struktūrą, akimirką pagalvos, kad vyksta kažkas sudėtingesnio.

Nuo Python 2.6 ir naujesnių Python 2.x versijų * vietoj to galite naudoti str.translate, (bet apie Python 3 skirtumus skaitykite toliau):

line = line.translate(None, '!@#$')

arba reguliariosios išraiškos pakeitimas naudojant re.sub

import re
line = re.sub('[!@#$]', '', line)

Skliausteliuose nurodyti simboliai sudaro ženklų klasę. Bet kokie line simboliai, priklausantys šiai klasei, pakeičiami antruoju sub parametru: tuščia eilute.

Python 3 versijoje eilutės yra Unicode. Reikės versti šiek tiek kitaip. kevpie apie tai užsimena komentare prie vieno iš atsakymų, ir tai'pažymėta dokumentacijoje str.translate.

Kviečiant Unicode eilutės translate metodą, negalima perduoti antrojo parametro, kurį naudojome anksčiau. Taip pat negalima perduoti None kaip pirmojo parametro arba net vertimo lentelės iš string.maketrans. Vietoj to kaip vienintelį parametrą reikia perduoti žodyną. Šiame žodyne simbolių ordinalinės vertės (t. y. rezultatas, gautas iškvietus ord jiems) yra perkeliamos į simbolių, kurie turėtų juos pakeisti, ordinalias vertes arba - mums naudinga - į None, nurodantį, kad jie turėtų būti ištrinti.

Taigi, norėdami atlikti pirmiau minėtą šokį su Unicode eilute, turėtumėte iškviesti kažką panašaus į

translation_table = dict.fromkeys(map(ord, '!@#$'), None)
unicode_line = unicode_line.translate(translation_table)

Čia dict.fromkeys ir map naudojami glaustai sukurti žodyną, kuriame yra

{ord('!'): None, ord('@'): None, ...}

Dar paprasčiau, kaip rašoma kitame atsakyme, sukurti žodyną vietoje:

unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})

* dėl suderinamumo su ankstesniais Pythonais galite sukurti "null" vertimo lentelę, kurią perduosite vietoj None:

import string
line = line.translate(string.maketrans('', ''), '!@#$')

Čia string.maketrans naudojamas vertimo lentelei, kuri yra tiesiog eilutė, kurioje yra simboliai su eilės vertėmis nuo 0 iki 255, sukurti.

Komentarai (7)
line = line.translate(None, " ?.!/;:")
Komentarai (2)

"Python" kalba eilutės yra nekintamos. Metodas pakeisti po pakeitimo grąžina naują eilutę. Išbandykite:

for char in line:
    if char in " ?.!/;:":
        line = line.replace(char,'')
Komentarai (3)