Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
2 / 2 / 1
Регистрация: 08.11.2019
Сообщений: 79

Поиск и замена одной цифры в массиве

12.04.2020, 19:20. Показов 3744. Ответов 17

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые форумчане.

В файле есть строка вида - Data value="00000000 00000000"
Нужно проверить последнюю цифру и если она ноль, то заменить на единицу.

Ищу регуляркой, находит корректно, именно последнюю цифру
Python
1
2
3
lookforBit = r'Data value=\"\d{8} \d\d\d\d\d\d\d(\d)\"'
 
bit = re.search(lookforBit, fileContent)[1]
Но когда пытаюсь заменить на единицу, то заменяется не найденная цифра, а вся строка Data value="00000000 00000000"
Python
1
fileContent = re.sub(lookforBit, '1', fileContent)
Получается, что оператор re.search понимает, что нужно искать только то, что выделено скобками, а re.sub не понимает.
Подскажите, пожалуйста, как решить данную задачу?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.04.2020, 19:20
Ответы с готовыми решениями:

Как сделать одной функцией, поиск только цифры и поиск по количеству знаков одновременно
Есть предложение обл Владимирская, р-н Селиий, д Копнино, ул sfsdfghf, д. 27 rd 1021 601343 5006812523167644 атоыволпжважр как...

Замена цифры в строчном массиве числом символа '_'
Преобразовать строку, заменяя каждую цифру соответствующим ей числом символов нижнего подчеркивания. Например: «3 слона» -> «_ _...

Поиск и замена в зависимости от впередиидущей цифры
Собственно сабж. Есть текст: "Всего было 1024 коней." Нужно чтобы скрипт из этого находил "4 коней." и менял на "4...

17
 Аватар для codcw
815 / 527 / 214
Регистрация: 22.12.2017
Сообщений: 1,495
12.04.2020, 19:42
Python
1
re.sub(r'Data value=\"\d{8} \d\d\d\d\d\d\d(\d)\"', '1', fileContent)
0
2 / 2 / 1
Регистрация: 08.11.2019
Сообщений: 79
12.04.2020, 21:48  [ТС]
codcw, у меня же тоже самое, только через переменную. Это не работает.
0
 Аватар для codcw
815 / 527 / 214
Регистрация: 22.12.2017
Сообщений: 1,495
13.04.2020, 01:24
Python
1
2
3
4
import re
a = r'Data value="00000000 00000000"'
b = re.sub('\d\"', '1\"', a)
print(b)
окей, я тоже не понял почему sub не воспринимает группирование скобками, вот только так могу предложить
1
2 / 2 / 1
Регистрация: 08.11.2019
Сообщений: 79
13.04.2020, 08:57  [ТС]
codcw, да, в данном конкретном случае так можно выкрутиться, но мне нужно будет ещё и другие цифры в этой строки проверять и менять. И этот способ уже не пройдёт.
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,927
Записей в блоге: 5
13.04.2020, 09:48
Лучший ответ Сообщение было отмечено TheBogdan как решение

Решение

Замена последней цифры, предпоследней, предпредпоследней...
Python
1
2
3
4
5
6
7
8
import re
a = r'Data value="00000000 00000000"'
b = re.sub(r'\d(\D+$)', r'1\1', a)
print(b)
b = re.sub(r'\d(\d\D+$)', r'1\1', a)
print(b)
b = re.sub(r'\d(\d\d\D+$)', r'1\1', a)
print(b)
3
150 / 120 / 36
Регистрация: 01.11.2019
Сообщений: 425
13.04.2020, 11:28
Если надо проверить по условию, то мне кажется тут без доп функции не обойтись

Python
1
2
3
4
5
6
7
8
9
10
11
import re
txt= 'asdasdasda Data value="00000000 00000005" asdasdasdasdasd Data value="00000000 00000000" sjdfglskdjglsdkjgl'
 
def f(m):
    c = list(m.group())
    if c[28] == '0':                # Проверяем по индексу
        c[28] = '1'                 # Заменяем по индексу
        return ''.join(c)
    return ''.join(c)
find = re.sub(r'Data value="\d+ \d+"', f, txt)
print(find)
1
2 / 2 / 1
Регистрация: 08.11.2019
Сообщений: 79
13.04.2020, 13:39  [ТС]
palva, дело в том, что строка данных не состоит из одних нолей, там нули и единицы вперемешку, поэтому в явном виде "Data value="00000000 00000000"" её нельзя указывать.

Но решение пришло.

Поступил так -
Нахожу нужную строку oldCode = re.search(r'Data value="\d{8} \d{8}"', fileContent)[0]
Заменяю в ней цифру c помощью Вашего кода newCode = re.sub(r'\d(\D+$)', r'1\1', oldCode)
Целиком заменяю старую строку на новую fileContent = re.sub(r'Data value="\d{8} \d{8}"', newCode, fileContent)

Может и не красиво, но работает.
Спасибо за подсказку!

Добавлено через 9 минут
volkomorov, это пока сложно для меня. Подскажите, пожалуйста, что такое c[28] , почему 28?
0
150 / 120 / 36
Регистрация: 01.11.2019
Сообщений: 425
13.04.2020, 14:19
Data value="00000000 00000005" имеет в себе 29 символов
Разбиваем строку с помощью split() и получаем список этих символов.
Т.к. индексация начинается не с единицы, а с нуля, то индекс первого символа "D" будет - 0, а последнего - 28
Таким образом мы можем поменять любые символы по условию

Добавлено через 17 минут
Так немного запутал

Data value="00000000 00000005" имеет в себе 30 символов
Разбиваем строку с помощью split() и получаем список этих символов.
Т.к. индексация начинается не с единицы, а с нуля, то индекс первого символа "D" будет - 0, а последнего '"'- 29
Таким образом мы можем поменять любые символы по условию

Добавлено через 10 минут
Вот, добавил принты для наглядности что происходит, запустите и проанализируйте


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import re
txt= 'asdasdasda Data value="00000000 00000005" asdasdasdasdasd Data value="00000000 00000000" sjdfglskdjglsdkjgl'
 
def function_sub(text): 
    text_list = list(text.group())          # Разбиваем текст Data value="00000000 00000005" и создаем список символов
    print(text_list)                        # Печатаем список
    
    len_text_list = len(text_list)          # Получаем длину списка 
    print(len_text_list)                    # Печатаем длину списка
 
    if text_list[28] == '0':                # Проверяем последнюю цифру по индексу 
        text_list[28] = '1'                 # Меняем значение
        text_new = ''.join(text_list)       # Собираем строку
        print(text_new)                     # Печатаем новую строку
        return text_new                     # Возвращаем новую строку если условие выполнено
    return ''.join(text_list)               # Возвращаем исходную строку если условие не выполнено
 
 
find = re.sub(r'Data value="\d+ \d+"', function_sub, txt)
print(find)
1
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
13.04.2020, 14:35
volkomorov, а не проще ли, find_item[:-1] + "1" использовать?

Добавлено через 9 минут
palva, этот вариант не подойдет, все числа будут меняться:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import re
 
 
fileContent = """
asdasdasda Data value="00000000 00000005" asdasdasdasdasd
Data value="00000000 00000000" sjdfglskdjglsdkjgl
CONST value="12910"
"""
 
print(re.sub(r'\d(\D+$)', r'1\1', fileContent))
 
# asdasdasda Data value="00000000 00000005" asdasdasdasdasd
# Data value="00000000 00000000" sjdfglskdjglsdkjgl
# CONST value="12911"
Добавлено через 43 секунды
Костыльно выглядит, но все таки:

Python
1
2
3
4
5
6
7
pattern = r"""(Data value="\d{8} \d{7})(\d)(")"""
 
print(re.sub(pattern, r"""\g<1>1\g<3>""", fileContent))
 
# asdasdasda Data value="00000000 00000001" asdasdasdasdasd
# Data value="00000000 00000001" sjdfglskdjglsdkjgl
# CONST value="12910"
Добавлено через 2 минуты
UPD: Только сейчас заметил что первый пример, вообще не работает.*
0
150 / 120 / 36
Регистрация: 01.11.2019
Сообщений: 425
13.04.2020, 14:37
Вы хоть задание читали? Написано же - "Нужно проверить последнюю цифру и если она ноль, то заменить на единицу"

А если она не "0", а если надо заменить четвертую цифру с конца?
1
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
13.04.2020, 14:44
volkomorov, оу, неуглядел, согласен, извеняюсь.

Добавлено через 55 секунд
volkomorov, тогда так:

Python
1
pattern = r"""(Data value="\d{8} \d{7})(0)(")"""
Добавлено через 5 минут
Цитата Сообщение от volkomorov Посмотреть сообщение
А если она не "0", а если надо заменить четвертую цифру с конца?
Да как бы, да если бы. Можно менять pattern, как вам угодно, это будет проще и понятнее, и это будет работать в отличии от других советчиков. ¯\_(ツ)_/¯
0
150 / 120 / 36
Регистрация: 01.11.2019
Сообщений: 425
13.04.2020, 14:45
А если по двум условиям одновременно? Например, последнюю на единицу на четвертую с конца на 5?
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
13.04.2020, 15:17
DmFat, Я не спец по работе с файлами. Вопрос:
Если файл состоит из множества строк и мы меняем одну строку, то производится перезапись всего файла?
Нет способа загрузив одну строку и изменив ее записать новый вариант в то же место в файле, при необходимости сдвинув текст, который идет за этой строкой?
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
13.04.2020, 15:31
Viktorrus, прямого способа вроде нет.
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,927
Записей в блоге: 5
14.04.2020, 13:50
Цитата Сообщение от DmFat Посмотреть сообщение
palva, этот вариант не подойдет, все числа будут меняться:
Да, я понял, что неправ.
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
14.04.2020, 15:02
Цитата Сообщение от Viktorrus Посмотреть сообщение
Нет способа загрузив одну строку и изменив ее записать новый вариант в то же место в файле, при необходимости сдвинув текст, который идет за этой строкой?
Перезаписать сверху возможность есть, без изменения всего файла, а вот чтобы сдвинуть, придется считать полезные данные которые идут после, вернуться в позицию вставки, вставить и заново записать полезные данные.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
14.04.2020, 22:12
Цитата Сообщение от DmFat Посмотреть сообщение
придется считать полезные данные которые идут после, вернуться в позицию вставки, вставить и заново записать полезные данные.
Считывать порциями мы можем, а вот записывать по моему только целиком или только в конец. Все дело в том, как работает операционная система. Файл на диске хранится как правило не целиком а частями. Я уже немного подзабыл. Но при удалении файла само содержимое файла не удаляется, а удаляется только его имя или идентификатор , точно не помню. И все куски на диске, которые он занимал, помечаются как свободные. И любая новая запись на диск пишется в эти куски. Не уверен, что цепочку адресов этих кусков можно поменять. Скорее всего ее можно только дополнить (то есть дописать в конец файла). Но как я сказал, я уже плохо все это помню, да и в последних версиях операционных систем это могло поменяться.
Но в питоне прямых команд удалить конец файла или вставлять внутрь файла я не знаю.
В общем для себя я решил перезаписывать файл целиком, тем более что я не работаю со сверх большими файлами.
Спасибо что ответили.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.04.2020, 22:12
Помогаю со студенческими работами здесь

Поиск и замена нескольких слов в одной ячейке
Привет. Гугл не помог. А скрипты и всё что сложнее не понимаю. Есть много предложений записанных в столбик. И таблица, в первом...

Поиск/замена в массиве
В excel на листе можно найти/заменить данные командой Range(Columns(7), Columns(15)).Replace What:=заменяемое, Replacement:=заменяющее,...

Поиск и замена в одномерном массиве
Дан одномерный массив, который содержит не более 60 символов, которые образуют слова, разделенные пробелом. Заменить слово «mom» на «dad». ...

Поиск и замена в одномерном массиве
Решите задачи данной группы, оформив решение в виде процедур генерации, вывода и обработки массивов. Предусмотрите в процедуре генерации...

Поиск элементов и замена в двумерном массиве
В массиве все элементы ,стоящие выше максимального элемента,заменить на максимальный элемент первого столбца! Есть часть кода где...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru