微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不用正则表达式来查找文本模式

@H_404_1@
  # 假设你希望在字符串中查找电话号码,  # 你知道模式: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中的字符串很短,但它也可能包含上百万个字符,程序运行仍然不需要一秒钟。使用正则表达式查找电话号码的类似程序,运行也不会超过一秒钟,  但使用正则表达式编写这类程序会快的多。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐