Проблема регулярного выражения Python с числами - PullRequest
0 голосов
/ 15 января 2019

Мне нужно найти пробел после 3 или 4 цифр в связке имен файлов и заменить пробел подчеркиванием. Но я не могу даже найти 4 цифры вместе.

s = "the blue dog and blue cat wore blue hats"
p = re.compile(r'blue (?P<animal>dog|cat)')
print(p.sub(r'gray \g<animal>',s))

#Gives basically what I want.
the gray dog and gray cat wore blue hats


s = "7053 MyFile.pptx"
p = re.compile('[0-9][0-9][0-9][0-9](?P<dig> )')
print(p.sub('_\g<dig>', s))

#Takes out the numbers, which I need to keep
_ MyFile.pptx

Все, что я делаю, имеет выражение, которое вынимает цифры, которые мне нужно сохранить.

В конце концов, я хочу

7035 MyFile.pptx

будет

7035_MyFile.pptx

1 Ответ

0 голосов
/ 15 января 2019

Если вы хотите заменить 3 или 4 цифры, за которыми следуют пробел с той же цифрой, за которой следует подчеркивание, правильный синтаксис / замена регулярного выражения будет:

re.sub(r"([0-9]{3,4})\s", r"\1_", s)

Возможно, вы неправильно прочитали, как работают группы / обратные ссылки. То, что должно быть в группе, должно быть в скобках. Если вы хотите использовать именованную группу (что немного не нужно):

re.sub(r"(?P<dig>[0-9]{3,4})\s", r"\g<dig>_", s)

Или с предварительно скомпилированным регулярным выражением, похожим на ваш пример:

s = "7053 MyFile.pptx"
p = re.compile(r"(?P<dig>[0-9]{3,4})\s")
print(p.sub('\g<dig>_', s))

{3,4} после [0-9] означает три или четыре матча. \s обозначает пробел (не просто пробел).

На самом деле просто поиск 3 цифр, как написано, также будет соответствовать 4 цифрам, потому что мы не ограничиваем то, что происходит до сопоставления с шаблоном. В зависимости от того, что вы ищете, вы можете ограничить совпадения, добавив к шаблону ^ (начало строки) или \b пустой символ на краю слова ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...