使用正则表达式在Python中构建一个疯狂的libs程序

时间:2016-02-09 01:46:10

标签: python-3.x

我是一位新的Python程序员,正在阅读使用Python自动化无聊的东西这本书。其中一个章节结束项目是建立一个疯狂的libs程序。基于到目前为止所介绍的内容,我认为作者打算让我使用正则表达式。

这是我的代码:

#! python3
#
# madlibs.py - reads a text file and let's the user add their own text
# anywhere the words ADJECTIVE, NOUN, ADVERB, or VERB appear in the text
# file.

import sys, re, copy

# open text file, save text to variable

if len(sys.argv) == 2:
    print('Opening text file...')
    textSource = open(sys.argv[1])
    textContent = textSource.read()
    textSource.close()
else:
    print('Usage: madlibs.py <textSource>')

# locate instances of keywords

keywordRegex = re.compile(r'ADJECTIVE|NOUN|ADVERB|VERB', re.I)
matches = keywordRegex.findall(textContent)

# prompt user to replace keywords with their own input

answers = copy.copy(matches)

for i in range(len(answers)):
    answers[i] = input()

# create a new text file with the end result

for i in range(len(matches)):
    findMatch = re.compile(matches[i])
    textContent = findMatch.sub(answers[i], textContent)

print(textContent)

textEdited = open('madlibbed.txt', 'w')
textEdited.write(textContent)
textEdited.close()

我用于textSource的输入是一个文本文件:

  

这是测试源文件。它包含关键字ADJECTIVE,以及关键字NOUN。此外,它还有另一个NOUN实例,然后是ADVERB之一。

我的问题是findMatch.sub方法一次替换了两个NOUN实例。我知道这就是sub()方法的工作原理,但是我很难想出一种解决它的简单方法。如何设计此程序,以便它一次只能定位和替换一个关键字?我不希望所有的NOUN用同一个单词替换,而是用不同的单词替换用户输入的顺序。

2 个答案:

答案 0 :(得分:1)

您只需要将关键字参数计数设置为sub,这样就可以在设置后不再替换匹配项。

init()

有关详细信息,请参阅https://docs.python.org/3/library/re.html#re.sub

答案 1 :(得分:1)

thodnev 的答案有效,但有时你最好通过首先标记字符串,然后用部分构建一个新的字符串。

如果你的字符串是:

textContent = 'This is the test source file. It has the keyword ADJECTIVE in it, as well as the keyword NOUN. Also, it has another instance of NOUN and then one of ADVERB.'

然后您可以使用re.finditer执行此操作:

for it in re.finditer(r'ADJECTIVE|NOUN|ADVERB|VERB', textContent):
    print(it.span(), it.group())

给出

(49, 58) ADJECTIVE
(89, 93) NOUN
(128, 132) NOUN
(149, 155) ADVERB

您可以将此信息与子字符串一起使用,以您希望的方式构建新字符串。