2 / 2 / 1
Регистрация: 08.11.2019
Сообщений: 79

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

12.04.2020, 19:20. Показов 3776. Ответов 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,930
Записей в блоге: 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,930
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru