简单模式的正则表达式

时间:2019-04-23 06:27:48

标签: python regex

问题

我有一个图像数据集,描述了出​​现在特定图像中的不同活动。数据集中的每个图像都命名为<activity>_<num>。例如educating_13.jpgpracticing_147.jpg

现在,我想选择具有相同活动的图像,例如说“烹饪”,因此我决定使用Python中的re模块进行此操作。我写的脚本就像

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中使用异常机制,结果证明近15万张图像中有一个名为temp.txt的文本文件,这是违反模式的文件。

3 个答案:

答案 0 :(得分:3)

不使用正则表达式。使用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 :(得分:1)

re.match(pattern, root)如果不匹配,则可以返回None

  1. 您可以检查re.match(pattern, root) == None的结果并找到图片
  2. 使用https://regex101.com/检查图像名称的正则表达式

答案 2 :(得分:1)

如果re.match(pattern, root)为None,则调用.group(1)将给您属性错误。因此,在某些情况下,您似乎无法匹配目录中的所有条目。

很难知道哪些问题给您带来了麻烦,但是默认情况下,\w仅与[a-zA-Z0-9_]相匹配,因此:

  • 文件中是否包含标点符号(例如%)?
  • 是否有文件包含非ASCII字符(例如ñ)?
  • 目录中是否还存在与数据集无关的文件?

您可以发布目录列表,然后也许我们可以找到文件。