@zhangyu756897669
2017-09-04T15:39:30.000000Z
字数 4203
阅读 594
Python官方文档19.0
python官方文档
正则表达式是有帮助的,但是即使大多数现代文本编辑器和文字处理器(如Microsoft Word或OpenOffice)都可以找到可以基于正则表达式进行搜索的查找和替换功能,非程序员也不会不知道这些表达式。事实上,科技作家Cory Doctorow认为即使在教学编程之前,我们也应该先教正式表达式:
“知道[正则表达式]可以意味着解决问题的三个步骤与3,000个步骤之间的差异。当你是一个书呆子的时候,你不知道通过几次敲击键盘才能解决的问题,可能会让其他人厌烦,而且容易出错。“
在本章中,您将首先编写一个程序来查找文本模式,而不使用正则表达式,然后查看如何使用正则表达式来使代码不那么blo肿。我将向您展示与正则表达式的基本匹配,然后继续使用一些更强大的功能,例如字符串替换和创建自己的字符类。最后,在本章结尾,您将编写一个程序,可以自动从一组文本中提取电话号码和电子邮件地址。
假设你想在字符串中找到一个电话号码。你知道这个模式:三个数字,一个连字符,三个数字,连字符和四个数字。 例如: 415-555-4242.
我们使用一个名为isPhoneNumber()的函数来检查一个字符串是否匹配此模式,返回True或False。
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.py中的最后四个print()函数调用:
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
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
继续循环通过消息,最终组块中的12个字符将是一个电话号码。循环遍历整个字符串,测试每个12个字符的部分,并打印发现满足isPhoneNumber()的任何块。完成消息后,我们打印完成。
虽然在这个例子中消息中的字符串很短,但它可能是数百万个字符,并且该程序仍将在不到一秒钟内运行。使用正则表达式查找电话号码的类似程序也将在不到一秒钟内运行,但正则表达式可以更快地编写这些程序。
Python中的所有正则表达式函数都在re模块中。
import re
phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
r'\d\d\d-\d\d\d-\d\d\d\d'
比 输入'\\d\\d\\d-\\d\\d\\d-\\d\\d\\d\\d'
更容易。 正则表达式对象的search()方法搜索传递给正则表达式的任何匹配的字符串。如果在字符串中找不到正则表达式,则search()方法将返回None。如果找到该模式,则search()方法返回一个Match对象。匹配对象具有一个group()方法,它将从搜索的字符串中返回实际匹配的文本。 (我稍后会解释一下。)
phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
mo = phoneNumRegex.search('My number is 415-555-4242.')
print('Phone number found: ' + mo.group())
Phone number found: 415-555-4242
虽然在Python中使用正则表达式有几个步骤,但每个步骤都相当简单。