Python - RE使用函数re.compile + search

时间:2016-10-13 16:58:45

标签: python regex if-statement

我在Python(2.7)中使用regex库're'来验证航班号。

我在这里使用非常有用的在线编辑器对预期输出没有任何问题:http://regexr.com/

我在regexr.com上的结果是:http://imgur.com/nB0QDug

我的代码是:

import re
test1 = 'ba116'
###Referencelink: http://academe.co.uk/2014/01/validating-flight-codes/
p = re.compile('/^([a-z][a-z]|[a-z][0-9]|[0-9][a-z])[a-z]?[0-9]{1,4}[a-z]?$/g')
m = p.search(test1)  # p.match() to find from start of string only
if m:
print 'It works!: ', m.group()  # group(1...n) for capture groups
else:
print 'Did not work'

我不确定为什么我得到'不工作'输出,其中regexr显示一个匹配(如预期的那样)

我做了一个更简单的正则表达式查找,似乎结果是正确的,所以看起来我的正则表达式字符串无效,或者我正在使用re.complile(或者也许是if循环)不正确?

'ba116'有效,应该匹配。

1 个答案:

答案 0 :(得分:1)

Python的re.compile将您的前导/和尾随/g视为正则表达式的一部分,而不是分隔符和修饰符。这会产生一个永远不会匹配任何东西的编译RE,因为你有^前面有东西,$后面有东西。

re.compile的第一个参数应该是一个字符串,其中只包含 您将使用/.../正则表达式表达式的语言放入斜杠的内容。 g修饰符对应于在编译的RE上调用findall方法;在这种情况下,它似乎是不必要的。 (其他一些修饰符,例如ism,对应于传递给re.compile second 参数的值。)< / p>

所以这就是你的代码应该是这样的:

import re
test1 = 'ba116'
###Referencelink: http://academe.co.uk/2014/01/validating-flight-codes/
p = re.compile(r'^([a-z][a-z]|[a-z][0-9]|[0-9][a-z])[a-z]?[0-9]{1,4}[a-z]?$')
m = p.search(test1)  # p.match() to find from start of string only
if m:
    print 'It works!: ', m.group()  # group(1...n) for capture groups
else:
    print 'Did not work'

开放引用之前的r这个正则表达式没有任何区别,但是如果你需要在RE中使用反斜杠,它将使你不必将它们全部加倍