Если вы хотите выяснить, действительно ли переменная, которую вы тестируете, явно пустым массивом, вы можете использовать что-то вроде этого:
if ($variableToTest === array()) {
echo 'this is explicitly an empty array!';
}
re.sub(r'(?:_a)?\.([^.]*)$', r'_suff.\1', "long.file.name.jpg")
?:
запускает группу без соответствия ( SO answer ), поэтому (?:_a)
соответствует _a
, но не перечисляет его, следующий вопросительный знак делает его необязательным.
Итак, по-английски, это говорит, что конец .<anything>
, следующий за (или не), шаблон _a
Другой способ сделать это - использовать lookbehind ( см. здесь ). Упомя все это, потому что они очень полезны, но я не знал о них за 15 лет работы с REs
Вы можете сделать это, исключив детали из замены. Я имею в виду, вы можете сказать модулю регулярного выражения; «сопоставляются с этим шаблоном, но заменяют его частью».
re.sub(r'(?<=long.file.name)(\_a)?(?=\.([^\.]*)$)' , r'_suff',"long.file.name.jpg")
>>> 'long.file.name_suff.jpg'
long.file.name и .jpg части используются для сопоставления, но они исключаются из замещения.
Поместите группу захвата вокруг части, которую вы хотите сохранить, а затем добавьте ссылку на эту группу захвата в текст замены.
re.sub(r'(\_a)?\.([^\.]*)$' , r'_suff.\2',"long.file.name.jpg")
Просто поместите выражение для расширения в группу, запишите его и укажите совпадение в замене:
re.sub(r'(?:_a)?(\.[^\.]*)$' , r'_suff\1',"long.file.name.jpg")
Кроме того, использование группы, не содержащей захвата (?:…)
, предотвратит повторную запись к большой ненужной информации.
\1
, либо поместить его в r''
, а не только ''
.
– Amber
4 May 2010 в 09:17