Czy w Pythonie istnieje sposób na podciąganie łańcucha znaków?

Czy w Pythonie istnieje sposób na podanie fragmentu łańcucha, aby uzyskać nowy ciąg od trzeciego znaku do końca łańcucha?

Może jak myString[2:end]?

Jeśli opuszczenie drugiej części oznacza "do końca", jeśli opuszczenie pierwszej części, czy zaczyna się od początku?

 1656
Author: Robert Harvey, 2009-03-19

10 answers

>>> x = "Hello World!"
>>> x[2:]
'llo World!'
>>> x[:2]
'He'
>>> x[:-2]
'Hello Worl'
>>> x[-2:]
'd!'
>>> x[2:-2]
'llo Worl'

Python nazywa to pojęcie "krojeniem" i działa nie tylko na strunach. Zajrzyj Tutaj , aby uzyskać wyczerpujące wprowadzenie.

 2508
Author: Paolo Bergantino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:51

Tak dla kompletności, jak nikt inny o tym nie wspomniał. Trzeci parametr wycinka tablicy to krok. Więc odwrócenie ciągu jest tak proste jak:

some_string[::-1]

Lub wybranie alternatywnych znaków to:

"H-e-l-l-o- -W-o-r-l-d"[::2] # outputs "Hello World"

Możliwość przechodzenia do przodu i do tyłu przez ciąg utrzymuje spójność z możliwością układania plasterka od początku lub końca.

 314
Author: Endophage,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-05 16:58:56

Substr () normalnie (tj. PHP i Perl) działa w ten sposób:

s = Substr(s, beginning, LENGTH)

Więc parametry to beginning i LENGTH.

Ale zachowanie Pythona jest inne; oczekuje początku i końca (!). To jest trudne do zauważenia przez początkujących. więc poprawnym zamiennikiem dla Podstr (s, początek, długość) jest

s = s[ beginning : beginning + LENGTH]
 95
Author: Michał Leon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-22 15:24:49

Powszechnym sposobem osiągnięcia tego celu jest krojenie strun. MyString[a:b] daje substring z indeksu a do (b-1)

 45
Author: codingscientist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-16 21:55:23

Brakuje tu jednego przykładu: pełna (płytka) Kopia.

>>> x = "Hello World!"
>>> x
'Hello World!'
>>> x[:]
'Hello World!'
>>> x==x[:]
True
>>> 

Jest to wspólny idiom do tworzenia kopii typów sekwencji (nie internowanych ciągów). [:] Shallow kopiuje listę, zobacz python-list-slice-used-for-no-oczywista-reason.

 16
Author: gimel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:48

Czy w Pythonie istnieje sposób na podanie fragmentu łańcucha, aby uzyskać nowy ciąg od trzeciego znaku do końca łańcucha?

Może jak myString[2:end]?

Tak, to rzeczywiście działa, jeśli przypisać, lub bind , Nazwa, end, do stałej singleton, None:

>>> end = None
>>> myString = '1234567890'
>>> myString[2:end]
'34567890'

Notacja Slice ma 3 ważne argumenty:

  • start
  • stop
  • krok

Ich wartości domyślne, gdy nie podano to None - ale możemy przekazać them explicitly:

>>> stop = step = None
>>> start = 2
>>> myString[start:stop:step]
'34567890'

Jeśli opuszczenie drugiej części oznacza "do końca", jeśli opuszczenie pierwszej części, czy zaczyna się od początku?

Tak, na przykład:

>>> start = None
>>> stop = 2
>>> myString[start:stop:step]
'12'

Zauważ, że włączamy start w plasterku, ale idziemy tylko do, i nie wliczając, stop.

Gdy step jest None, domyślnie plasterek używa 1 dla tego kroku. Jeśli krok z ujemną liczbą całkowitą, Python jest wystarczająco inteligentny, aby przejść od końca do początku.

>>> myString[::-1]
'0987654321'

I wyjaśnij notację slice bardzo szczegółowo w moja odpowiedź na pytanie dotyczące notacji slice.

 14
Author: Aaron Hall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-30 02:00:07

Masz to tutaj, z wyjątkiem "koniec". To się nazywa notacja na plasterki. Twój przykład powinien brzmieć:

new_sub_string = myString[2:]

Jeśli pominiesz drugi parametr, będzie to w domyśle koniec łańcucha.

 7
Author: bouvard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-22 15:23:28

Chciałbym dodać dwa punkty do dyskusji:

  1. Możesz użyć None zamiast pustego miejsca, aby określić "od początku "lub"do końca":

    'abcde'[2:None] == 'abcde'[2:] == 'cde'
    
    Jest to szczególnie przydatne w funkcjach, gdzie nie można podać pustej przestrzeni jako argumentu:
    def substring(s, start, end):
        """Remove `start` characters from the beginning and `end` 
        characters from the end of string `s`.
    
        Examples
        --------
        >>> substring('abcde', 0, 3)
        'abc'
        >>> substring('abcde', 1, None)
        'bcde'
        """
        return s[start:end]
    
  2. Python ma slice obiekty:

    idx = slice(2, None)
    'abcde'[idx] == 'abcde'[2:] == 'cde'
    
 6
Author: ostrokach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-30 22:36:32

Może to przeoczyłem, ale nie mogłem znaleźć na tej stronie pełnej odpowiedzi na oryginalne pytanie(pytania), ponieważ zmienne nie są dalej omawiane tutaj. Więc musiałem szukać dalej.

Ponieważ nie mogę jeszcze komentować, pozwolę sobie tutaj dodać swój wniosek. Jestem pewien, że nie tylko ja byłem zainteresowany tym, gdy wchodziłem na tę stronę:

 >>>myString = 'Hello World'
 >>>end = 5

 >>>myString[2:end]
 'llo'

Jeśli opuścisz pierwszą część, otrzymasz

 >>>myString[:end]
 'Hello' 

I jeśli zostawiłeś : w środku również masz najprostszy podciąg, który będzie to 5. znak (count zaczynając od 0, więc w tym przypadku jest to puste):

 >>>myString[end]
 ' '
 2
Author: Rudi Uhl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-18 12:01:43

Używanie indeksów na twardo może być bałaganem.

Aby tego uniknąć, Python oferuje wbudowany obiekt slice().
string = "my company has 1000$ on profit, but I lost 500$ gambling."
Jeśli chcemy wiedzieć, ile pieniędzy mi zostało.

Roztwór normalny:

final = int(string[15:19]) - int(string[43:46])
print(final)
>>>500

Używając plasterków:

EARNINGS = slice(15, 19)
LOSSES = slice(43, 46)
final = int(string[EARNINGS]) - int(string[LOSSES])
print(final)
>>>500

Używając slice zyskujesz czytelność.

 0
Author: levi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-22 15:26:57