返回介绍

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

发布于 2024-01-22 21:44:06 字数 2250 浏览 0 评论 0 收藏 0

假设你希望在字符串中查找电话号码。你知道模式:3个数字,一个短横线,3个数字,一个短横线,再是4个数字。例如:415-555-4242。

假定我们用一个名为isPhoneNumber()的函数,来检查字符串是否匹配模式,它返回True或False。打开一个新的文件编辑器窗口,输入以下代码,然后保存为isPhoneNumber.py:

 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'))

运行该程序,输出看起来像这样:

415-555-4242 is a phone number:
True
Moshi moshi is a phone number:
False

isPhoneNumber()函数的代码进行几项检查,看看text中的字符串是不是有效的电话号码。如果其中任意一项检查失败,函数就返回False。代码首先检查该字符串是否刚好有12个字符❶。然后它检查区号(就是text中的前3个字符)是否只包含数字❷。函数剩下的部分检查该字符串是否符合电话号码的模式:号码必须在区号后出现第一个短横线❸,3个数字❹,然后是另一个短横线❺,最后是4个数字❻。如果程序执行通过了所有的检查,它就返回True❼。

用参数'415-555-4242'调用isPhoneNumber()将返回真。用参数'Moshi moshi'调用isPhoneNumber()将返回假,第一项测试失败了,因为不是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')

该程序运行时,输出看起来像这样:

Phone number found: 415-555-1011
Phone number found: 415-555-9999
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中的字符串很短,但它也可能包含上百万个字符,程序运行仍然不需要一秒钟。使用正则表达式查找电话号码的类似程序,运行也不会超过一秒钟,但用正则表达式编写这类程序会快得多。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文