我在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'有效,应该匹配。
答案 0 :(得分:1)
Python的re.compile
将您的前导/
和尾随/g
视为正则表达式的一部分,而不是分隔符和修饰符。这会产生一个永远不会匹配任何东西的编译RE,因为你有^
前面有东西,$
后面有东西。
re.compile
的第一个参数应该是一个字符串,其中只包含 您将使用/.../
正则表达式表达式的语言放入斜杠的内容。 g
修饰符对应于在编译的RE上调用findall
方法;在这种情况下,它似乎是不必要的。 (其他一些修饰符,例如i
,s
,m
,对应于传递给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中使用反斜杠,它将使你不必将它们全部加倍