Нахождение подстроки внутри строки и ее среза? - PullRequest
1 голос
/ 28 апреля 2011

Я пытался помочь своему другу с его заданием, и я даже не могу понять, с чего начать. Я могу заставить его идентифицировать подстроку внутри строки, но меня беспокоит вопрос о том, где она начинается. Я был на этом часами. Любая помощь приветствуется. Вот все, что я имею о назначении ниже.

PS. весь его класс не знает, как это сделать. Учитель дал им какой-то выход из их и моей лиги.

Напишите программу, которая просит пользователя ввести две строки stringA и stringB.

  1. Сначала программа должна найти все начальные позиции в строке A, где появляется строка B.

    Например, если строка A равна "the car is in that carport", а строка B равно "car", программа должна сообщить, что строка B встречается в строке A, начиная с позиций 4 и 19 (помните, что строка начинается с позиции 0).

  2. Далее программа должна найти все начальные позиции в строке A, где Строка B почти появляется.

    • Что означает «почти», так это то, что одна из букв строки B не матч.
    • Например если строка A такая же, как указано выше, а строка B равна "the", программа должен сообщить, что Строка B почти появляется, начиная с позиции 14, которая является началом строка "tha".
    • Примечание что он не сообщает, что он почти появляется, начиная с позиции 0, так как там это появляется с нулевым несоответствием.
  3. Наконец, программа должна найти все начальные позиции в строке A где обратная сторона Появится строка B.

    • Например, если строка A такая же, как указано выше, и строка B равна "rop", тогда программа должна сообщить, что обратная строка B появляется в Строка A, начиная с позиции 22.

Программа equalsubstrings.py полезна для понимания того, как написать эту программу.

Ответы [ 3 ]

1 голос
/ 28 апреля 2011
stringA = "the car is in that carport"
stringB = "the"

exact = []
reverse = []
almost = []

lenA = len(stringA)
lenB = len(stringB)
limit = lenA - lenB
reversedB = stringB[::-1]

pos = stringA.find(stringB)
while pos >= 0:
    exact.append(pos)
    pos = stringA.find(stringB, pos + 1)

pos = stringA.find(reversedB)
while pos >= 0:
    exact.append(pos)
    pos = stringA.find(reversedB, pos + 1)

for i in range(limit):
    substrA = stringA[i:i+lenB]
    misses = 0
    for j in range(lenB):
        if substrA[j] != stringB[j]:
            misses += 1
    if misses == 1:
        almost.append(i)

print exact, almost, reverse
0 голосов
/ 28 апреля 2011

Я бы использовал модуль re .

  • re.finditer позволяет просматривать все совпадения подстроки в строке.
  • Каждое совпадение дает вам «объект совпадения».
  • Используйте mo.start() для любого объекта совпадения, чтобы найти индекс этого совпадения в строке.
  • Для "почти" совпадений, переберите строкуB char-by-char, заменив текущий символ на [^<current_character>], и повторите процедуру сопоставления для каждого полученного регулярного выражения, записав все совпадения.
  • Наконец, выполните простой поиск с обратной строкой B (см. В другом месте).

Преимущество этого подхода: вы хорошо разбираетесь в re :-).

Кстати: что за загадочная equalsubstrings.py программа? ; -.)

0 голосов
/ 28 апреля 2011

Я дам вам две подсказки:

Чтобы проверить, является ли строка подстрокой другой, вы можете сделать:

  1. Использовать найти :

a = "это тест"

б = "тест"

a.find (б, 0,14)

10

  1. используйте оператор in, как в следующем примере:

a = "это тест" б = «тест» c = "несвязанный текст" б в Правда б в с Ложные

Чтобы перевернуть строку, сделайте что-то вроде следующего:

>>> a="this is a test"
>>> a[::-1]
'tset a si siht'

Удачи с домашней работой

...