Регулярное выражение для соответствия начала имени файла и расширения имени файла - PullRequest
18 голосов
/ 09 октября 2008

Какое регулярное выражение соответствует строкам (в данном случае именам файлов), которые начинаются с «Выполнить» и имеют расширение файла «.py»?

Регулярное выражение должно соответствовать любому из следующего:

RunFoo.py
RunBar.py
Run42.py

Не должно совпадать:

myRunFoo.py
RunBar.py1
Run42.txt

SQL-эквивалент того, что я ищу, это ... LIKE 'Run%.py' ....

Ответы [ 8 ]

38 голосов
/ 09 октября 2008

Для регулярного выражения вы должны использовать:

re.match(r'Run.*\.py$')

Краткое объяснение:

  • . означает совпадение с любым символом.
  • * означает совпадение с любым повторением предыдущего символа (следовательно, * означает любую последовательность символов)
  • \ - это спасение от явной точки
  • $ обозначает «конец строки», поэтому мы не совпадаем с «Run_foo.py.txt»

Однако для этой задачи вам, вероятно, лучше использовать простые строковые методы. то есть.

filename.startswith("Run") and filename.endswith(".py")

Примечание: если вы хотите, чтобы регистр не учитывался (т. Е. Соответствует «run.PY», а также «Run.py», используйте параметр re.I для регулярного выражения или конвертируйте в конкретный регистр (например, filename.lower ()) перед использованием строковых методов.

15 голосов
/ 09 октября 2008

Внимание:

  • Ответ jobscry ("^ Run.?. Py $") неверен (например, не соответствует "Run123.py").
  • Ответ orlandu63 ("/^Run[\w]*?.py$/") не будет соответствовать "RunFoo.Bar.py".

(у меня недостаточно репутации, чтобы комментировать, извините.)

13 голосов
/ 09 октября 2008

Я не очень понимаю, почему вы после регулярного выражения решаете эту «проблему». Вы просто нашли способ найти все файлы .py, которые начинаются с «Run». Так что это простое решение, которое будет работать, не прибегая к компиляции запуска регулярного выражения:

import os
for filename in os.listdir(dirname):
    root, ext = os.path.splitext(filename)
    if root.startswith('Run') and ext == '.py':
        print filename
7 голосов
/ 09 октября 2008
/^Run.*\.py$/

Или, в частности, в python:

import re
re.match(r"^Run.*\.py$", stringtocheck)

Это будет соответствовать "Runfoobar.py", но не "runfoobar.PY". Чтобы сделать его нечувствительным к регистру, вместо этого используйте:

re.match(r"^Run.*\.py$", stringtocheck, re.I)
4 голосов
/ 09 октября 2008

Вам не нужно регулярное выражение, вы можете использовать glob, который принимает подстановочные знаки, например Run * .py

Например, чтобы получить эти файлы в текущем каталоге ...

import os, glob
files = glob.glob( "".join([ os.getcwd(), "\\Run*.py"]) )
3 голосов
/ 09 октября 2008

Если вы напишите немного более сложное регулярное выражение, вы можете получить дополнительную функцию: извлечь бит между «Run» и «.py»:

>>> import re
>>> regex = '^Run(?P<name>.*)\.py$'
>>> m = re.match(regex, 'RunFoo.py')
>>> m.group('name')
'Foo'

(дополнительный бит - круглые скобки и все, что между ними, кроме '. *', Как в ответе Роба Говарда)

0 голосов
/ 09 октября 2008

mabye:

^Run.*\.py$

просто быстрая попытка

0 голосов
/ 09 октября 2008

Вероятно, это не полностью соответствует стандартам именования файлов, но здесь все сказано:

/^Run[\w]*?\.py$/
...