2014-09-23 3 views
0

В 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)

+0

А ну, ответ не делает объяснения ... Я оставлю это здесь, то: '[^ \ d ^] 'не означает, что«соответствует ничего, кроме начала строки или цифр», это означает, msgstr "совпадение ничего, кроме цифр или'^'. То же самое для' [^ \ d $] 'где'^'и' $ 'больше не строковые привязки, а буквальные символы. В качестве альтернативы вы можете использовать один и тот же код, но с регулярным выражением : '([^ \ d] | ^)% s ([^ \ d] | $)' (кванторы не нужны). – Jerry

ответ

Смежные вопросы