2012-11-20 172 views
2

将链接发布到删除标点符号的最佳方式之前。删除标点符号python

我正在创建一个madLib游戏,用一个名词,副词,动词,形容词等代替段落中的单词;它应该从一个单独的文件中取出一个随机单词,并在合适的地方将其打印到段落中,即将一个动词运行放入该段落指出VERB的位置。我遇到的唯一问题是当我要替换的单词旁边有标点时,我无法做到这一点。比如VERB,或者VERB!

我的问题是如何在保留标点的情况下替换所有这些值。

+0

您是否必须将空白格式设置为UPPERCASE_PART_OF_SPEECH?如果可以,请尝试将其更改为“{词性}”。 (即“这是一个{动词}!')。 Python有一个非常全面的字符串格式化程序,可以完美地处理像这样的事情。 –

回答

2
noun1="Donkey" 
print("This should print a %s here"%(noun1)) 

本质上,你可以得到你的输入变量,并像这个例子一样对待它们。

+0

+1为例子名词 – RocketDonkey

2

不确定您的使用案例,但replacecount参数设置为1有效吗?

>>> test = 'This is a VERB! Whoa, a VERB? Yeah, a VERB!#$%' 
>>> test.replace('VERB', 'running', 1) 
'This is a running! Whoa, a VERB? Yeah, a VERB!#$%' 
>>> test.replace('VERB', 'running', 1).replace('VERB', 'swimming', 1).replace('VERB', 'sleeping', 1) 
'This is a running! Whoa, a swimming? Yeah, a sleeping!#$%' 

当然,您必须对重复次数进行一些调整,但它应该处理好标点符号。

按以下@ mgilson的建议,你可以通过执行类似删除多次呼吁要replace

In [14]: s = 'This is a VERB! Whoa, a VERB? Yeah, a VERB!#$%' 

In [15]: verbs = ['running', 'jumping', 'swimming'] 

In [16]: reduce(lambda x, y: x.replace('VERB', y, 1), verbs, s) 
Out[16]: 'This is a running! Whoa, a jumping? Yeah, a swimming!#$%' 

它使用reduce功能对主串运行replace,使用值verbs作为要替换的那些。减少的最后一个参数是字符串本身,它将包含每次迭代中替换的结果(并且在开始时将是'普通'字符串)。

+0

Argv!我只是输入这个(+1)。你甚至可以摆脱'test.replace()。replace()。replace()...'使用'reduce' :) – mgilson

+0

@mgilson哈哈,我正在引导我的内心mgilson。 – RocketDonkey

+1

@mgilson我可以放心地说,你说这让我试着更好地理解减少。更新与我认为的工作,并一如既往,感谢推动我的想法:) – RocketDonkey

0

使用re模块的子功能。捕获单词后面的字符,然后将新单词替换单词,采用反向引用追加拍摄的标点符号:

>>> import re 
>>> s = "VERB," 
>>> print re.sub(r'VERB([\,\!\?\;\.]?)', r'newword\1', s) 
newword, 

可以展开字符类[\,\!\?\;\.]包括你会遇到什么标点符号,这只是一个例子。