2008-10-08 3 views
16

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

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

RunFoo.py 
RunBar.py 
Run42.py 

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

myRunFoo.py 
RunBar.py1 
Run42.txt 

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

ответ

32

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

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

быстрое объяснение:

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

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

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

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

0

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

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

выглядит как решение Perl для вопроса помеченной питона ... но я не эксперт питона: р и, поскольку jobscry указала, что ваше решение чувствительно к регистру. – 2008-10-08 23:57:35

+0

* err has Rob Howard указал, что это – 2008-10-08 23:58:20

+0

Не следует использовать. *, А не \ w - пунктуация и пробелы и т. Д., Вероятно, все равно должны рассматриваться как часть имени файла. например «Run.foo.py» – Brian 2008-10-08 23:58:30

6
/^Run.*\.py$/ 

Или, питона именно:

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

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

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

mabye:

^Run.*\.py$ 

просто быстро попробовать

+0

Вам нужно. *, а не.? (который будет соответствовать только одному символу) – Brian 2008-10-08 23:54:28

14

предупреждения.

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

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

2

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

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

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

12

Я не совсем понимаю, почему вы после регулярного выражения решаете эту «проблему». Вы только что нашли способ найти все .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 
4

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

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

import os, glob 
files = glob.glob("".join([ os.getcwd(), "\\Run*.py"]))