我很感激阅读/解释这种常规表达(Python语法)的一些帮助:
(?:^|[b_./-])[Tt]est
(在查找测试文件时,nosetest使用默认的RE作为过滤器)。 Described here in the 'Extended usage' section.
编辑:If you came here due to looking into nose, you may want to look into pytest as an alternative.
到目前为止我的理解: open-paren问号冒号 stuff close paren是一个'扩展',意味着从匹配结果中的字符串中排除 stuff 。哪个(从我的观点来看,只是试图理解给定的文件名是否满足或失败表达式)意味着我可以忽略它(?)
最后一部分'[Tt] est'表示测试或测试。
其余的含义是朦胧的。插入符号表示“匹配字符串的开头”,竖线表示OR,括号中的字符(b,下划线,句点,斜线,减号)是替代匹配。换句话说,匹配字符串开头或5个指定字符之一,然后是测试或测试?这意味着字符串'bTest'和'/ Test'会匹配(而且它们显然不匹配)。
感谢您帮助我改进对模式的解释!
答案 0 :(得分:3)
(?:...)
是非捕获组;与(...)
相同但不会导致捕获的组值。它限制了|
备用组中包含的内容。该组要么匹配字符串的开头,要么匹配其中一个字符b
,_
,.
,/
或-
。
因此,表达式在行的开头包含Test
或test
的输入文本或者直接在b
前面的下划线,点,斜杠或者破折号。
'bTest'
和/Test
执行匹配:
>>> pattern = re.compile(r'(?:^|[b_./-])[Tt]est')
>>> pattern.search('Test').group()
'Test'
>>> pattern.search('Hello bTest').group()
'bTest'
>>> pattern.search('Hello /Test').group()
'/Test'
b
令人惊讶,所以我看了source code。文档缺少反斜杠,而不是b
匹配,但是\b
:
r'(?:^|[\b_\.%s-])[Tt]est' % os.sep)
\b
是一个字边界,在test
或Test
之前不是任何单词字符。这很可能是个错误; \b
不能成为角色类的一部分,\b
无效。相反,它将被视为退格字符。
这个问题是3年前的reported to the project。
答案 1 :(得分:3)
非捕获组 (?: ... )
对正则表达式的匹配无效
(?:^|[b_./-])[Tt]est
...所以在一行的开头它会匹配:
test
Test
或文本中任何地方的以下选项之一:
bTest
btest
_Test
_test
.Test
.test
/Test
/test
-Test
-test