Question

J'ai un script qui analyse les noms des épisodes de séries TV (montrer.nom.s01e02.avi par exemple), saisit le nom de l'épisode (à partir de la www.thetvdb.com API) et renomme automatiquement dans quelque chose de plus sympa (le Nom du Spectacle - [01x02].avi)

Le script fonctionne très bien, jusqu'à ce que vous essayez de l'utiliser sur les fichiers qui ont Unicode show-noms (quelque chose que je n'ai jamais vraiment pensé, puisque tous les fichiers que j'ai sont en anglais, donc pour la plupart à peu près tous dans [a-zA-Z0-9'\-])

Comment puis-je autoriser les expressions régulières pour faire correspondre les caractères accentués et les aime?Actuellement, la regex de la section de configuration ressemble..

config['valid_filename_chars'] = """0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@£$%^&*()_+=-[]{}"'.,<>`~? """
config['valid_filename_chars_regex'] = re.escape(config['valid_filename_chars'])

config['name_parse'] = [
    # foo_[s01]_[e01]
    re.compile('''^([%s]+?)[ \._\-]\[[Ss]([0-9]+?)\]_\[[Ee]([0-9]+?)\]?[^\\/]*$'''% (config['valid_filename_chars_regex'])),
    # foo.1x09*
    re.compile('''^([%s]+?)[ \._\-]\[?([0-9]+)x([0-9]+)[^\\/]*$''' % (config['valid_filename_chars_regex'])),
    # foo.s01.e01, foo.s01_e01
    re.compile('''^([%s]+?)[ \._\-][Ss]([0-9]+)[\.\- ]?[Ee]([0-9]+)[^\\/]*$''' % (config['valid_filename_chars_regex'])),
    # foo.103*
    re.compile('''^([%s]+)[ \._\-]([0-9]{1})([0-9]{2})[\._ -][^\\/]*$''' % (config['valid_filename_chars_regex'])),
    # foo.0103*
    re.compile('''^([%s]+)[ \._\-]([0-9]{2})([0-9]{2,3})[\._ -][^\\/]*$''' % (config['valid_filename_chars_regex'])),
]
Était-ce utile?

La solution

Utiliser un sous-groupe de [\u0000-\uFFFF] pour ce que vous voulez.

Vous pouvez également utiliser l' re.UNICODE drapeau de compilation. Les docs dire que si UNICODE est définie, \w va correspondre à la caractères [0-9_] plus tout ce qui est classé comme alphanumériques dans les propriétés des caractères Unicode base de données.

Voir aussi http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-05/2560.html.

Autres conseils

Le module re de Python n'est pas support \p{Lettre} ou \X.Cependant, l' new regex mise en œuvre sur PyPI n'.

En Mastering Regular Expressions de Jeffrey Friedl (grand livre), il est mentionné que vous pouvez utiliser \p{Lettre} qui va correspondre à unicode choses qui est considéré comme une lettre.

\X semble être disponible comme un mot générique caractères dans certaines langues, il permet de faire correspondre un caractère unique sans tenir compte du nombre d'octets qu'il utilise.Pourrait être utile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top