Найти все вхождения символа в строке

19

Я пытаюсь найти все вхождения "|" в строке.

def findSectionOffsets(text):
    startingPos = 0
    endPos = len(text)

    for position in text.find("|",startingPos, endPos):
        print position
        endPos = position

Но я получаю сообщение об ошибке:

    for position in text.find("|",startingPos, endPos):
TypeError: 'int' object is not iterable
    
задан theAlse 22.10.2012 в 12:39
источник
  • text.find («|», startPos, endPos) дает вам одно значение int, которое цикл for выполняет итерацию ... –  avasal 22.10.2012 в 12:40
  • stackoverflow.com/questions/4664850/... –  georg 22.10.2012 в 12:57

6 ответов

32

Функция

def findOccurences(s, ch):
    return [i for i, letter in enumerate(s) if letter == ch]


findOccurrences(yourString, "|")

вернет список индексов вашейString, в котором | происходят     

ответ дан Marco L. 22.10.2012 в 12:50
источник
  • как работает этот цикл? i для i, буква в перечислении (именах), если буква == ch. –  Goodword 23.06.2015 в 01:04
  • @Goodword: этот ответ использует понимание списка; см. учебник Python. –  Martijn Pieters♦ 02.06.2016 в 01:43
  • Функция написана неправильно в строке определения. Это должно быть «def findOccurrences» с двумя r. –  R. Wayne 04.02.2018 в 01:20
9

, если вы хотите, чтобы индекс всей видимости символа | в строке вы могли сделать это

In [30]: import re

In [31]: str = "aaaaaa|bbbbbb|ccccc|dddd"

In [32]: [x.start() for x in re.finditer('\|', str)]
Out[32]: [6, 13, 19]

также вы можете сделать

In [33]: [x for x, v in enumerate(str) if v == '|']
Out[33]: [6, 13, 19]
    
ответ дан avasal 22.10.2012 в 12:45
источник
2

Здесь легко использовать регулярные выражения;

import re

def findSectionOffsets(text):
    for m in re.finditer('\|', text):
        print m.start(0)
    
ответ дан Roland Smith 22.10.2012 в 12:56
источник
1

text.find () возвращает только первый результат, а затем вам нужно установить новую начальную позицию на основе этого. Так вот так:

def findSectionOffsets(text):
    startingPos = 0
    endPos = len(text)

    position = text.find("|", startingPos, endPos):
    while position > -1:
        print position
        startingPos = position + 1
    
ответ дан M Somerville 22.10.2012 в 12:48
источник
1
import re
def findSectionOffsets(text)
    for i,m in enumerate(re.finditer('\|',text)) :
        print i, m.start(), m.end()
    
ответ дан Zulu 22.10.2012 в 12:57
источник
1

text.find возвращает целое число (индекс, в котором найдена нужная строка), поэтому вы можете запускать цикл для него.

Я предлагаю:

def findSectionOffsets(text):
    indexes = []
    startposition = 0

    while True:
        i = text.find("|", startposition)
        if i == -1: break
        indexes.append(i)
        startposition = i + 1

    return indexes
    
ответ дан samfrances 22.10.2012 в 12:48
источник
  • Я не думаю, что это сработает, потому что исходное положение никогда не меняется - он будет зацикливаться навсегда, если будет совпадение. –  M Somerville 22.10.2012 в 12:49
  • да, я написал этот ответ, прежде чем тестировал его. Правильно изменился. –  samfrances 22.10.2012 в 12:50