如何阅读python正则表达式(?:^ | [b _./-])[Tt] \ test

时间:2014-01-02 00:09:32

标签: python regex string

我很感激阅读/解释这种常规表达(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'会匹配(而且它们显然不匹配)。

感谢您帮助我改进对模式的解释!

2 个答案:

答案 0 :(得分:3)

(?:...)非捕获组;与(...)相同但不会导致捕获的组值。它限制了|备用组中包含的内容。该组要么匹配字符串的开头,要么匹配其中一个字符b_./-

因此,表达式在行的开头包含Testtest的输入文本或者直接在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是一个字边界,在testTest之前不是任何单词字符。这很可能是个错误; \b不能成为角色类的一部分,\b 无效。相反,它将被视为退格字符。

这个问题是3年前的reported to the project

答案 1 :(得分:3)

非捕获组 (?: ... )对正则表达式的匹配无效

(?:^|[b_./-])[Tt]est

Regular expression visualization

...所以在一行的开头它会匹配:

test
Test

或文本中任何地方的以下选项之一:

bTest
btest
_Test
_test
.Test
.test
/Test
/test
-Test
-test