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

Михаил Кростелев

@twistfire92

Python backend developer

s='aaaaaabaaaaabaaaabaaaab'
pos = s.find('b',s.find('b')+1)

В переменную pos будет записано второе вхождение символа ‘b’

По сути, вторым параметром в методе find() указываешь позицию, следующую после первого вхождения нужного символа

Ответ написан

более трёх лет назад


Комментировать


Комментировать

I have heard that JavaScript has a function called search() that can search for a string ( lets call it A ) in another string ( B ) and it will return the first position at which A was found in B.

var str = "Ana has apples!";
var n = str.search(" ");

The code should return 3 as its the first position in which the space was found in str.

And I was wondering if there is a function that can find the next spaces in my string.

For example I want to find the length of the first word in my string and I could easily do this If I knew the its starting position and its ending one.

If there is such a function, are there any better than it for such things?

Salman A's user avatar

Salman A

259k82 gold badges428 silver badges520 bronze badges

asked Jun 29, 2018 at 12:06

Ionut Eugen's user avatar

6

You need to use String.indexOf method. It accepts the following arguments:

str.indexOf(searchValue[, fromIndex])

So you can do this:

var str = "Ana has apples!";
var pos1 = str.indexOf(" ");           // 3
var pos2 = str.indexOf(" ", pos1 + 1); // 7
console.log(pos2 - pos1 - 1);          // 3... length of the second word

answered Jun 29, 2018 at 12:49

Salman A's user avatar

Salman ASalman A

259k82 gold badges428 silver badges520 bronze badges

.indexOf(…) will give you the first occurence of the " " (starting at 0):

var str = "Ana has apples!";
var n = str.indexOf(" ");
console.log(n);

If you want all occurences, this can be achieved easily using a RegExp with a while:

var str = "Ana has apples! A lot.";
var re = new RegExp(" ","ig");
var spaces = [];
while ((match = re.exec(str))) {
  spaces.push(match.index);
}

// Output the whole array of results
console.log(spaces);

// You can also access the spaces position separately:
console.log('1st space:', spaces[0]);
console.log('2nd space:', spaces[1]);



Or… you can use a do {} while () loop:

Then, you can make a function of it:

var str = "Ana has apples! A lot.";

// Function
function indexsOf(str, sub) {
  var arr = [],
    i = 0,
    n = 0;

  do {
    n = str.indexOf(" ");
    if (n > -1) {
      i += n;
      arr.push(i);
      str = str.slice(n + 1);
      i++;
    }
  }
  while (n > -1);
  return arr;
}

var spaces = indexsOf(str, ' ')

// Output the whole array of results
console.log(spaces);

// You can also access the spaces position separately:
console.log('1st space:', spaces[0]);
console.log('2nd space:', spaces[1]);



Hope it helps.

answered Jun 29, 2018 at 12:16

Takit Isy's user avatar

Takit IsyTakit Isy

9,6263 gold badges22 silver badges47 bronze badges

2

Better for matching is to use regex. There is option like match group using group 'g' flag

var str = "Ana has apples  !";
var regBuilder = new RegExp(" ","ig");
var matched = "";
while((matched = regBuilder.exec(str))){
    console.log(matched + ", position : " +matched.index);
}

str = "Ana is Ana no one is better than Ana";
regBuilder = new RegExp("Ana","ig");
while((matched = regBuilder.exec(str))){
    console.log(matched + ", position : " +matched.index);
}

'i' flag used to ignore case sensitive
You can check for other flags too here

answered Jun 29, 2018 at 12:34

Onk_r's user avatar

Onk_rOnk_r

8364 silver badges21 bronze badges

Try this:

const str = "Ana has apples!";

const spaces = str.split('')
                  .map((c, i) => (c === ' ') ? i : -1)
                  .filter((c) => c !== -1);

console.log(spaces);

Then you will all the spaces positions.

answered Jun 29, 2018 at 12:44

Alex G's user avatar

Alex GAlex G

1,8772 gold badges9 silver badges15 bronze badges

2

Дана строка. Найдите в этой строке второе вхождение буквы f и выведите индекс этого вхождения. Если буква f в данной строке встречается только один раз, выведите число -1, а если не встречается ни разу, выведите число -2. Индексы нумеруются с нуля.
Вот мой код:

#include <iostream>
#include <string>
using namespace std;

int main() {

    string a; // объявление строки
    cin >> a; // ввод строки
    for(int i=0, number = 0;i<a.size();i++) { // цикл для поиска второго вхождения

        if (a[i] == 'f') { // если индекс равен  букве "f"
            
            if (++number == 2) { // если это вторая буква
                cout << i << endl; // то вывести индекс
                break;
            }
            
                    int res = 0;
                    char f = 'f';
        for (int i=0;i<a.length();i++) { // цикл для того, чтобы посчитать, сколько раз буква "f" встречается в введённом слове
        
  

        if (a[i] == f) { // если буква равна "f"
            res++; // то увеличить "res"
            
            if (res == 1) { // если буква встречается 1 раз
                cout << "-1" << endl; // то вывести -1
            }   else if (res == 0) { // если буквы вообще нет
                cout << "-2" << endl; // то вывести -2
            }
        }
            
        }
 
        }

    }

    return 0;
}

Подскажите, пожалуйста, что я делаю неправильно? Когда пытаюсь вывести «-1» или «-2», то программа работает неправильно.

Harry's user avatar

Harry

214k15 золотых знаков117 серебряных знаков229 бронзовых знаков

задан 28 окт 2020 в 9:21

Ake1a's user avatar

11

for(int i=0, number = 0; i < a.size(); i++) 
{
    if (a[i] == 'f') 
    {
        if (++number == 2) 
        {
            cout << i << endl;
            break;
        }
    }
}

ответ дан 28 окт 2020 в 9:25

Harry's user avatar

HarryHarry

214k15 золотых знаков117 серебряных знаков229 бронзовых знаков

5

Не зря же написали методы std::string. Они написаны, чтобы было удобно работать со строками, и если вы их не используете, то работайте с обычными массивами. Если же использовать, то получим код компактней и защищенный от ошибок. Результат получится одной строчкой:

std::string a("coffee");    
std::cout << a.find('f', a.find('f') + 1);  

Если не уверены, что в строке найдется этот символ, то нужно выполнить с проверкой:

size_t i = a.find('f') + 1;  
if (i < a.size())
    cout << a.find('f', i);
 

ответ дан 28 окт 2020 в 9:42

AR Hovsepyan's user avatar

AR HovsepyanAR Hovsepyan

15.8k3 золотых знака13 серебряных знаков30 бронзовых знаков

#include <iostream>
#include <string>
#include <algorithm>

int main () {
    std::string s;    
    std::cin >> s;

    int c = std::count(s.begin(), s.end(), 'f');
    int i = s.find("ff") + 1;

    std::cout << "c=" << c << std::endl; 
    std::cout << "index=" << i << std::endl; 
}

ответ дан 28 окт 2020 в 18:26

TigerTV.ru's user avatar

TigerTV.ruTigerTV.ru

3,1851 золотой знак10 серебряных знаков21 бронзовый знак

Часто нам нужно найти символ в строке python. Для решения этой задачи разработчики используют метод find(). Он помогает найти индекс первого совпадения подстроки в строке. Если символ или подстрока не найдены, find возвращает -1.

Синтаксис

string.find(substring,start,end)

Метод find принимает три параметра:

  • substring (символ/подстрока) — подстрока, которую нужно найти в данной строке.
  • start (необязательный) — первый индекс, с которого нужно начинать поиск. По умолчанию значение равно 0.
  • end (необязательный) — индекс, на котором нужно закончить поиск. По умолчанию равно длине строки.

Параметры, которые передаются в метод, — это подстрока, которую требуются найти, индекс начала и конца поиска. Значение по умолчанию для начала поиска — 0, а для конца — длина строки.

В этом примере используем метод со значениями по умолчанию.

Метод find() будет искать символ и вернет положение первого совпадения. Даже если символ встречается несколько раз, то метод вернет только положение первого совпадения.


>>> string = "Добро пожаловать!"
>>> print("Индекс первой буквы 'о':", string.find("о"))
Индекс первой буквы 'о': 1

Поиск не с начала строки с аргументом start

Можно искать подстроку, указав также начальное положение поиска.

В этом примере обозначим стартовое положение значением 8 и метод начнет искать с символа с индексом 8. Последним положением будет длина строки — таким образом метод выполнит поиска с индекса 8 до окончания строки.


>>> string = "Специалисты назвали плюсы и минусы Python"
>>> print("Индекс подстроки 'али' без учета первых 8 символов:", string.find("али", 8))
Индекс подстроки 'али' без учета первых 8 символов: 16

Поиск символа в подстроке со start и end

С помощью обоих аргументов (start и end) можно ограничить поиск и не проводить его по всей строке. Найдем индексы слова «пожаловать» и повторим поиск по букве «о».


>>> string = "Добро пожаловать!"
>>> start = string.find("п")
>>> end = string.find("ь") + 1
>>> print("Индекс первой буквы 'о' в подстроке:", string.find("о", start, end))
Индекс первой буквы 'о' в подстроке: 7

Проверка есть ли символ в строке

Мы знаем, что метод find() позволяет найти индекс первого совпадения подстроки. Он возвращает -1 в том случае, если подстрока не была найдена.


>>> string = "Добро пожаловать!"
>>> print("Есть буква 'г'?", string.find("г") != -1)
Есть буква 'г'? False
>>> print("Есть буква 'т'?", string.find("т") != -1)
Есть буква 'т'? True

Поиск последнего вхождения символа в строку

Функция rfind() напоминает find(), а единое отличие в том, что она возвращает максимальный индекс. В обоих случаях же вернется -1, если подстрока не была найдена.

В следующем примере есть строка «Добро пожаловать!». Попробуем найти в ней символ «о» с помощью методов find() и rfind().


>>> string = "Добро пожаловать"
>>> print("Поиск 'о' методом find:", string.find("о"))
Поиск 'о' методом find: 1
>>> print("Поиск 'о' методом rfind:", string.rfind("о"))
Поиск 'о' методом rfind: 11

Вывод показывает, что find() возвращает индекс первого совпадения подстроки, а rfind() — последнего совпадения.

Второй способ поиска — index()

Метод index() помогает найти положение данной подстроки по аналогии с find(). Единственное отличие в том, что index() бросит исключение в том случае, если подстрока не будет найдена, а find() просто вернет -1.

Вот рабочий пример, показывающий разницу в поведении index() и find():


>>> string = "Добро пожаловать"
>>> print("Поиск 'о' методом find:", string.find("о"))
Поиск 'о' методом find: 1
>>> print("Поиск 'о' методом index:", string.index("о"))
Поиск 'о' методом index: 1

В обоих случаях возвращается одна и та же позиция. А теперь попробуем с подстрокой, которой нет в строке:


>>> string = "Добро пожаловать"
>>> print("Поиск 'г' методом find:", string.find("г"))
Поиск 'г' методом find: 1
>>> print("Поиск 'г' методом index:", string.index("г"))
Traceback (most recent call last):
File "pyshell#21", line 1, in module
print("Поиск 'г' методом index:", string.index("г"))
ValueError: substring not found

В этом примере мы пытались найти подстроку «г». Ее там нет, поэтому find() возвращает -1, а index() бросает исключение.

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

Чтобы найти общее количество совпадений подстроки в строке можно использовать ту же функцию find(). Пройдемся циклом while по строке и будем задействовать параметр start из метода find().

Изначально переменная start будет равна -1, что бы прибавлять 1 у каждому новому поиску и начать с 0. Внутри цикла проверяем, присутствует ли подстрока в строке с помощью метода find.

Если вернувшееся значение не равно -1, то обновляем значением count.

Вот рабочий пример:


my_string = "Добро пожаловать"
start = -1
count = 0

while True:
start = my_string.find("о", start+1)
if start == -1:
break
count += 1

print("Количество вхождений символа в строку: ", count )

Количество вхождений символа в строку:  4

Выводы

  • Метод find() помогает найти индекс первого совпадения подстроки в данной строке. Возвращает -1, если подстрока не была найдена.
  • В метод передаются три параметра: подстрока, которую нужно найти, start со значением по умолчанию равным 0 и end со значением по умолчанию равным длине строки.
  • Можно искать подстроку в данной строке, задав начальное положение, с которого следует начинать поиск.
  • С помощью параметров start и end можно ограничить зону поиска, чтобы не выполнять его по всей строке.
  • Функция rfind() повторяет возможности find(), но возвращает максимальный индекс (то есть, место последнего совпадения). В обоих случаях возвращается -1, если подстрока не была найдена.
  • index() — еще одна функция, которая возвращает положение подстроки. Отличие лишь в том, что index() бросает исключение, если подстрока не была найдена, а find() возвращает -1.
  • find() можно использовать в том числе и для поиска общего числа совпадений подстроки.

Задача «Второе вхождение» Решение

Условие

Дана строка. Найдите в этой строке второе вхождение буквы f, и выведите индекс этого вхождения. Если буква f в данной строке встречается только один раз, выведите число -1, а если не встречается ни разу, выведите число -2.

Решение

s = input()
if s.count('f') == 1:
    print(-1)
elif s.count('f') < 1:
    print(-2)
else:
    print(s.find('f', s.find('f') + 1))

Понравилась статья? Поделить с друзьями:
  • Компьютер не соответствует требованиям directaccess как исправить
  • Как найти свой стиль по описанию
  • Как найти путь файла в реестре
  • Как найти актуальную работу
  • Как найти равновесная цена на этом рынке