Регулярное выражение для простых шаблонов - PullRequest
0 голосов
/ 23 апреля 2019

Проблема

У меня есть набор данных изображения, который описывает различные действия, появляющиеся в определенных изображениях.Каждое изображение в наборе данных называется <activity>_<num>.Например, educating_13.jpg, practicing_147.jpg и т. Д.

Теперь я хочу выбрать изображения с той же активностью, скажем «готовка», и я решил сделать это, используя модуль re в Python.Сценарий, который я написал, похож на

pattern = "^(\w+)_(\d+)$"
for filename in os.listdir("."):
    root, _ = os.path.splitext(filename)
    activity = re.match(pattern, root).group(1)
    if activity == "cooking":
        # do something

Однако, хотя многие изображения успешно обрабатываются.Наконец оно прервано с AttributeError.Кажется, что некоторые изображения не могут быть сопоставлены с указанным шаблоном.

Так я допустил ошибку?Любой ввод приветствуется.

РЕДАКТИРОВАТЬ:

Используя механизм исключений в Python, получается, что из почти 150 тысяч изображений, есть текстовый файл с именем temp.txt, и это одинчто нарушает схему.

Ответы [ 3 ]

3 голосов
/ 23 апреля 2019

Без использования регулярных выражений.Использование str.split

Пример:

for filename in os.listdir("."):
    root, _ = os.path.splitext(filename)
    if "_" in root:
        activity, num = root.split("_")
        if activity == "cooking":
            # do something
1 голос
/ 23 апреля 2019

Если re.match(pattern, root) - None, то вызов .group(1) выдаст вам ошибку атрибута. Так что в некоторых случаях вы, похоже, не соответствуете всем записям в вашем каталоге.

Трудно понять, какие из них доставляют вам проблемы, но по умолчанию \w соответствует только [a-zA-Z0-9_], поэтому:

  • Есть ли в файлах знаки препинания (например,%)?
  • Содержат ли какие-либо файлы не-ASCII символы (например, ñ)?
  • Есть ли в каталоге файлы, не относящиеся к набору данных?

Вы можете опубликовать список каталогов, тогда, возможно, мы сможем найти файл.

1 голос
/ 23 апреля 2019

re.match(pattern, root) может вернуть None, если не совпадает

  1. Вы можете проверить результат re.match(pattern, root) == None и найти изображение
  2. , используйте https://regex101.com/, чтобы проверить регулярное выражение с именемизображений
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...