【问题标题】:Python regex optional capture group with positive lookahead具有正前瞻的 Python 正则表达式可选捕获组
【发布时间】:2018-10-23 17:48:20
【问题描述】:

试图找到某些文件夹模式。我可以有一个简单的 if 语句,但现在我想知道,这可以用一个正则表达式模式完成吗?

文件夹:

name
name_a01
name_a02
..
name_a20

name_dontuse_a10

pattern = re.match(".*name(_a[0-9])?", dir)

以上匹配正确,但同时匹配namename_dontuse_a10

pattern.group(1)

为这两个文件夹返回None,这样对我没有多大帮助。

我无法预测不需要的文件夹将被命名,但我想要基本名称文件夹和任何 name_a## folder。我想我需要一个 postie 前瞻,但不确定如何将它与可选的捕获组一起使用。

【问题讨论】:

  • 嘿,你可能想看看我的回答。另一个答案有一个错误。

标签: python regex python-2.7 regex-lookarounds


【解决方案1】:

试试这个:

pattern = re.match(".*name(_a[0-9]*)?$", dir)

我刚刚添加了$ 以匹配第一个下划线之后的字符串结尾。我还添加了[0-9]* 来匹配零个或多个数字。

现场示例:

https://regex101.com/r/MSldc6/2/

【讨论】:

  • 啊这么简单,0个或多个数字,0个或1个组匹配,在字符串的末尾
  • 另请注意,(_a[0-9]*)? 位表示可以选择匹配模式_a[0-9]* 一次。这允许它匹配name 的大小写,但也匹配name_a99,同时在name_a99_99 上正确失败
  • 我认为这个解决方案可以改进,因为.* 可以匹配名称之前的任何内容。考虑到它将匹配'dir1/dir2/junk_name'
  • 关于 OP 的问题,这完全足够了,.* 是匹配完整路径的一种快速而肮脏的方式 - 由于 OP 没有提供完整的示例路径,因此我们可能需要匹配C://Users/.../.../name_a90,所以除非问题更具体,否则应该没问题。
  • 你认为 OP 想匹配junk_name 吗?可能不是。我认为这是一个问题。
【解决方案2】:

最好的解决方案是首先从路径中提取文件名,这样您就不必在正则表达式中处理它。 normpath 删除任何尾随 /basename 提取文件名。所以对于dir1/dir2/name/,你会得到name

import os, re

dir = ...
name = os.path.basename(os.path.normpath(dir))

pattern = re.match("name(_a\d+)?", name)

请注意,在您的原始解决方案中发生的情况是 .* 匹配整个字符串,导致意外行为。

【讨论】:

  • 我匹配的是文件夹而不是文件
猜你喜欢
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 2016-08-19
  • 2018-11-08
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多