不用正则表达式来查找文本模式
# 假设你希望在字符串中查找电话号码,
# 你知道模式:3个数字,一个短横线,3个数字,一个短横线,再加4个数字;例如:415-555-4242
# 假定,我们用一个名为isPhoneNumer()的函数,来检查字符串是否匹配模式,它返回false或者true,如下代码演示:
def isPhoneNumber(text):
if len(text) != 12:
return False
for i in range(0,3):
if not text[i].isdecimal():
return False
if text[3] != '-':
return False
for i in range(4,7):
if not text[i].isdecimal():
return False
if text[7] != '-':
return False
for i in range(8,12):
if not text[i].isdecimal():
return False
return True
# print('415-555-4242 is a phone number:')
# print(isPhoneNumber('415-555-4242'))
# print('Moshi moshi is a phone number:')
# print(isPhoneNumber('Moshi moshi'))
#
# 检测步骤:
# 1 代码首先检查该字符串是否刚好有12个字符
# 2 检查区号,就是text中的前3个字符,是否只包含数字
# 3 函数剩下的部分检查该字符串是否符合电话号码的模式:号码必须在区号后出现第一个短横线
# 4 3个数字
# 5 另一个短横线
# 6 最后是4个数字
# 如果程序执行通过了所有的检查,就返回True
#
# 用参数'415-555-4242'调用isPhoneNumber()将返回真(True)
# 用参数'Moshi moshi'调用isPhoneNumber()将返回假(False)
# 第一项测试失败了,因为不是12个字符
#
# 必须添加更多代码,才能在更长的字符串中寻找这个文本模式。用下面的代码,替代 isPhoneNumber.py中4个print()函数调用
message = 'Call me at 415-555-1011 tomorrow. 415-555-9999 is my office.'
for i in range(len(message)):
chunk = message[i:i+12]
if isPhoneNumber(chunk):
print('Phone number found:'+chunk)
print('Done')
在for循环的每一次迭代中,取自message的一段新的12个字符被赋给变量chunk。
例如,在第一次迭代中,i是0,chunk被赋值为message[0:12](即字符串'Call me at 4').
在下一次迭代中,i是1,chunk被赋值为message[1:13](字符串'all me at 41').
将chunk传递给isPhoneNumber(),看看它是否符合电话号码的模式。如果符合,就打印出这段文本。
继续遍历message,最终chunk中的12个字符会是一个电话号码。该循环遍历了整个字符串,测试了每一段12个字符,打印出所有满足isPhoneNumber()的chunk。
当我们遍历完message,就打印出Done。
在这个例子中,虽然message中的字符串很短,但它也可能包含上百万个字符,程序运行仍然不需要一秒钟。使用正则表达式查找电话号码的类似程序,运行也不会超过一秒钟,
但使用正则表达式编写这类程序会快的多。
flameluo