Am 17.09.2019 um 20:59 schrieb Manfred Lotz:
I have a function like follows
def regex_from_filepat(fpat):
rfpat = fpat.replace('.', '\\.') \
.replace('%', '.') \
.replace('*', '.*')
return '^' + rfpat + '$'
As I don't want to have the replace() functions in one line my
question is if it is ok to spread the statement over various lines as
shown above, or if there is a better way?
Thanks.
Not related to your question, but:
You seem to try to convert a Windows wildcard pattern to a regex
pattern. However, wildcards sometimes behave a bit different than what
you assume. I know for instance that *.* matches any filename, even if
the filename doesn't contain a dot.
Out of curiosity I played around a bit, details below.
As you can see, there are other wildcard strangenesses, e.g.
- ? does not match a dot
- ???? between letters etc. matches exactly 4 characters, but
???? at the end or directly before a dot matches at most 4 characters
I don't know the exact rules of Windows wildcards, so there may be even
more cases of unexpected behavior.
If anyone knows where to find the complete rules (or a python module
that implements them), I would be interested.
Regards,
Ralf
----- Details (Win 7 home SP1) -----
C:\tmp>more pydirb.py
#!/usr/bin/env python3
import os, re, sys
def regex_from_filepat(fpat):
rfpat = fpat.replace('.', '\\.') \
.replace('?', '.') \
.replace('*', '.*')
return '^' + rfpat + '$'
regexfilepat = re.compile(regex_from_filepat(sys.argv[1]))
for name in os.listdir():
if regexfilepat.match(name):
print(name)
C:\tmp>dir /b *
foo
foo.bar
foo.bar.c
foo.c
pydirb.py
C:\tmp>pydirb *
foo
foo.bar
foo.bar.c
foo.c
pydirb.py
C:\tmp>dir /b *.*
foo
foo.bar
foo.bar.c
foo.c
pydirb.py
C:\tmp>pydirb *.*
foo.bar
foo.bar.c
foo.c
pydirb.py
C:\tmp>dir /b *.*.*.*.*
foo
foo.bar
foo.bar.c
foo.c
pydirb.py
C:\tmp>pydirb *.*.*.*.*
C:\tmp>dir /b foo.?
foo
foo.c
C:\tmp>pydirb foo.?
foo.c
C:\tmp>dir /b foo.????
foo
foo.bar
foo.c
C:\tmp>pydirb foo.????
C:\tmp>dir /b foo?bar
Datei nicht gefunden
C:\tmp>pydirb foo?bar
foo.bar
C:\tmp>dir /b f?o.bar
foo.bar
C:\tmp>pydirb f?o.bar
foo.bar
C:\tmp>dir /b f??o.bar
Datei nicht gefunden
C:\tmp>pydirb f??o.bar
C:\tmp>dir /b fo?.bar
foo.bar
C:\tmp>pydirb fo?.bar
foo.bar
C:\tmp>dir /b fo??.bar
foo.bar
C:\tmp>pydirb fo??.bar
C:\tmp>dir /b foo??.bar
foo.bar
C:\tmp>pydirb foo??.bar
--
https://mail.python.org/mailman/listinfo/python-list