Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Regular expression to match start of filename and filename extension

What is the regular expression to match strings (in this case, file names) that start with 'Run' and have a filename extension of '.py'?

The regular expression should match any of the following:

RunFoo.py
RunBar.py
Run42.py

It should not match:

myRunFoo.py
RunBar.py1
Run42.txt

The SQL equivalent of what I am looking for is ... LIKE 'Run%.py' ....

like image 339
Ray Avatar asked Oct 08 '08 23:10

Ray


3 Answers

For a regular expression, you would use:

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

A quick explanation:

  • . means match any character.
  • * means match any repetition of the previous character (hence .* means any sequence of chars)
  • \ is an escape to escape the explicit dot
  • $ indicates "end of the string", so we don't match "Run_foo.py.txt"

However, for this task, you're probably better off using simple string methods. ie.

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

Note: if you want case insensitivity (ie. matching "run.PY" as well as "Run.py", use the re.I option to the regular expression, or convert to a specific case (eg filename.lower()) before using string methods.

like image 194
Brian Avatar answered Sep 24 '22 04:09

Brian


Warning:

  • jobscry's answer ("^Run.?.py$") is incorrect (will not match "Run123.py", for example).
  • orlandu63's answer ("/^Run[\w]*?.py$/") will not match "RunFoo.Bar.py".

(I don't have enough reputation to comment, sorry.)

like image 41
Rob Howard Avatar answered Sep 22 '22 04:09

Rob Howard


I don't really understand why you're after a regular expression to solve this 'problem'. You're just after a way to find all .py files that start with 'Run'. So this is a simple solution that will work, without resorting to compiling an running a regular expression:

import os
for filename in os.listdir(dirname):
    root, ext = os.path.splitext(filename)
    if root.startswith('Run') and ext == '.py':
        print filename
like image 31
Jerub Avatar answered Sep 24 '22 04:09

Jerub