В python я хотел бы найти все точные вхождения числа 33 в этой строке и заменить его другим номером.regex: найти все вхождения определенного числа в строке
Мой входной строки:
original = '33 he3333llo 331 42 I\'m a 32 string 30 33 a33a 33\n 33'
и мой желаемый результат:
' NUMERO he3333llo 331 42 I\'m a NUMERO string 30 NUMERO a NUMERO a NUMERO \n NUMERO '
Здесь все вхождения 33 (но не 3333, а 331) была заменена заполнителем "Numero ».
Я попытался с помощью:
NUMERIC_PATTERN = re.compile(r'([^\d]+?)%s([^\d]+?)'%(33),re.UNICODE|re.DOTALL)
original = '33 he3333llo 331 42 I\'m a 32 string 30 33 a33a 33\n 33'
print original
print re.findall(NUMERIC_PATTERN,original)
print re.sub(NUMERIC_PATTERN,r'\1 NUMERO \2', original)
Что дает "почти" правильный ответ:
'33 he3333llo 331 42 I\'m a 32 string 30 NUMERO a NUMERO a NUMERO \n 33'
Однако первая и последняя 33 не совпадают.
Я думал, что это новое выражение должно исправить это, но это не (I включают начало и конец строки в качестве альтернативы, но она имеет тот же результат, первая версия):
NUMERIC_PATTERN2 = re.compile(r'([^\d^]+?)%s([^\d$]+?)'%(33),re.UNICODE|re.DOTALL)
Может кто-нибудь объяснить, почему NUMERIC_PATTERN2 не работает и предлагает решение? (я предпочел бы решение, которое использует стандартный модуль повторно в Python)
А ну, ответ не делает объяснения ... Я оставлю это здесь, то: '[^ \ d ^] 'не означает, что«соответствует ничего, кроме начала строки или цифр», это означает, msgstr "совпадение ничего, кроме цифр или'^'. То же самое для' [^ \ d $] 'где'^'и' $ 'больше не строковые привязки, а буквальные символы. В качестве альтернативы вы можете использовать один и тот же код, но с регулярным выражением : '([^ \ d] | ^)% s ([^ \ d] | $)' (кванторы не нужны). – Jerry