2015-07-21 5 views
1

Может ли кто-нибудь ответить на это? Я пытаюсь изучить модуль reg expression (re), и я не могу окунуться в это. Я пытаюсь придумать регулярное выражение, чтобы поймать все форматы имен файлов 3Регулярное выражение для python 3.4

Python 3.4.3

>>> re.findall("file[\_-]1","file-1 file_1, file\1") 
['file-1', 'file_1'] 
>>> 

Почему не ловя файл \ 1 ?? я сделал попробовать два других моделей, ни один работал :(

1. re.findall("file[\\_-]1","file-1 file_1, file\1") 
2. re.findall(r"file[\_-]1","file-1 file_1, file\1") 

Спасибо, Сагар

+1

Обратные косые имеют особое значение в строках Python и регулярных выражений ... смотри, например, https://docs.python.org/3/howto/regex.html#the-backslash-plague – jonrsharpe

+0

'\ 1' в" файле \ 1 "является символом управления' \ u0001; '. Если вы действительно планируете его захватить, используйте 'print (re.findall (" file [\ u0001 _-] 1? "," File-1 file_1, file \ 1 "))', но я сомневаюсь, что вам это нужно. –

ответ

1

Обратные косые имеют смысл в регулярных выражениях тоже; \_ просто означает буквального подчеркивание, не либо подчеркивание или обратная косая черта. Вместо этого вам нужно r'...' (необработанная строка Python) и\\ (буквальная обратная косая черта в регулярном выражении). Обратите внимание, что строка, которую вы пытаетесь найти, также должна быть необработанным литералом или имеют удвоенную обратную косую черту:

>>> "file-1 file_1, file\1" 
'file-1 file_1, file\x01' # probably not what you expected... 
>>> r"file-1 file_1, file\1" 
'file-1 file_1, file\\1' 

Таким образом, вы можете использовать:

>>> re.findall(r"file[\\_-]1", r"file-1 file_1, file\1") 
     # note^ ^ ^
['file-1', 'file_1', 'file\\1'] 
+0

Я читал документ python, о котором вы говорили. Все было хорошо до этой строки »... Однако, чтобы выразить это как строковый литерал Python, обе обратные косые черты должны быть снова удалены». Также, когда вы используете обратную косую черту внутри наборов символов [], их особое значение должно уходить вправо. Поэтому мое регулярное выражение может быть безопасным: re.findall ("file [\] 1", "file-1 file_1, file \ 1 ») .... Конечно, это не работает. Во-вторых, если я использую необработанную строку для регулярного выражения, то специальные символы автоматически исключаются? Таким образом, это будет: re.findall (r "file [\] 1", "file-1 file_1, file \ 1") Почему raw string + extra \ –

+0

@SagarKarale внутри квадратных скобок * только специальное выражение регулярного выражения * удален. Вам по-прежнему нужно либо удвоить обратную косую черту, либо сделать ее необработанной, чтобы удалить * строковый литерал специального значения *. – jonrsharpe

+0

Спасибо, Джон. Несколько примеров дали понять ... Я должен был дать «строковые литералы» и «выражение регулярных выражений» немного больше, чем раньше ... –

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