Python for Informatics 第11章 正则表达式六(译)

时间:2021-03-04 04:26:13

注:文章原文为Dr. Charles Severance 的 《Python for Informatics》。文中代码用3.4版改写,并在本机测试通过。

11.7 调试

  Python有一些简单和基本的内置文档,当你想快速复习触发你记忆的特定方法,这将非常有用。这个文档可以通过Python解释器在互动模式下查看。

  你可以使用help()命令带出互动的帮助系统

>>> help()

Welcome to Python 3.4's help utility!

If this is your first time using Python, you should definitely check out
the tutorial on the Internet at http://docs.python.org/3.4/tutorial/.

Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules. To quit this help utility and
return to the interpreter, just type "quit".

To get a list of available modules, keywords, symbols, or topics, type
"modules", "keywords", "symbols", or "topics". Each module also comes
with a one-line summary of what it does; to list the modules whose name
or summary contain a given string such as "spam", type "modules spam".

help> modules

  帮助系统下键入modules命令,帮助系统将显示所有可用的模块。

  如果你知道你想使用的模块名,你可以使用dir()命令显示模块中的方法(注意要退出帮助系统)

>>>import re

>>>dir(re)

['A', 'ASCII', 'DEBUG', 'DOTALL', 'I', 'IGNORECASE', 'L', 'LOCALE', 'M', 'MULTILINE', 'S', 'Scanner', 'T', 'TEMPLATE', 'U', 'UNICODE', 'VERBOSE', 'X', '_MAXCACHE', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '__version__', '_alphanum_bytes', '_alphanum_str', '_cache', '_cache_repl', '_compile', '_compile_repl', '_expand', '_pattern_type', '_pickle', '_subx', 'compile', 'copyreg', 'error', 'escape', 'findall', 'finditer', 'fullmatch', 'match', 'purge', 'search', 'split', 'sre_compile', 'sre_parse', 'sub', 'subn', 'sys', 'template']

  你同样可以用help命令得到关于特定方法的少量文档

>>> help (re.search)
Help on function search in module re:
search(pattern, string, flags=0)
Scan through string looking for a match to the pattern, returning
a match object, or None if no match was found.
>>>
  这个内置的文档不是非常广泛,但当你不想访问网页或搜索引擎而快速获取帮助时,它将非常有用。

11.8 词汇表

  脆弱代码(brittle code):在输入数据是一种特殊格式时可以运行,但是当输入的数据和正确格式有一些差异时容易失效的代码。

  贪婪匹配(greedy matching):正则表达式中"+"和"*"匹配扩展到最大可能的字符串。

  grep: 在绝大多数Unix系统中可用的命令,用来搜索整个文本文件,找出匹配正则表达式的行。它的名字代表通用正则表达式分析器。

  正则表达式:一个表达更加复杂查询字符串的语言。可能包含特殊字符表示只匹配查找位于行的开头或结尾,以及其他相似功能。

  通配符:可以匹配任意字符的特殊字符。在正则表达式中这个通配符是"."。
11.9 练习

练习11.1 编写一段程序模拟Unix系统中的grep命令。要求用户输入一个正则表达式,然后输出在mbox.txt文件中符合这个表达式的行数。

$ python grep.py
Enter a regular expression: ˆAuthor
mbox.txt had 1798 lines that matched ˆAuthor

$ python grep.py
Enter a regular expression: ˆXmbox.
txt had 14368 lines that matched ˆX-

$ python grep.py
Enter a regular expression: java$
mbox.txt had 4218 lines that matched java$

参考代码如下:

import re
input_re = input('Enter a regular expression:')
hand = open('mbox.txt')
count = 0
for line in hand:
if re.search(input_re,line):
count = count + 1
print('mbox.txt had ' + str(count) + ' that matched ' + input_re)

练习11.2 编写一个程序查找以下格式的行,然后用findall()方法抽取每行中的数字,计算它们的平均值并输出。

New Revision: 39772
Enter file:mbox.txt
38549.7949721
Enter file:mbox-short.txt
39756.9259259

参考代码如下:

import re
filename = input('Enter file:')
hand = open(filename)
count = 0
total = 0
for line in hand:
x = re.findall('New Revision: ([0-9]+)',line)
if len(x) > 0:
count = count + 1
total = total + int(x[0])
print(total/count)