2014-02-06 111 views
2

我刚刚开始学习Python,并且我已经以正则表达式的形式获得了“far”。我的任务似乎很简单。我只需要编写一个返回字符串中某些单词的正则表达式。规则如下:单词只能包含一组元音。换句话说,这是一个不完善但简单的正则表达式,旨在从文本中返回一个音节词。Python:返回完整的单词而不仅仅是字符串的specfic部分(正则表达式)

我相信我写的正则表达式并不是太遥远,但我只接收部分字符串,而不是完整的单词。示例如下:

>>> import re 

>>> text = "A boy named Sue tried to kill a swamp monkey, but failed miserably. He then cried. Boo hoo." 

>>> re.findall("[^aeiou][aeiou]{1,}[^aeiou]", text) 
['boy', 'nam', 'Sue ', 'ried', 'to ', 'kil', ' a ', 'wam', 'mon', 'key', 'but', 'fail', 'mis', 'rab', 'He ', 'hen', 'ried', 'Boo ', 'hoo.'] 

正如您所看到的,结果不正确。它只是分割字符串以适合我的正则表达式,而不是返回它来自的单词。此外,返回的一些字符串甚至不符合我的标准。

在此先感谢!

+0

(小StackOverflow的普罗蒂普:选择更好的用户名我们不是reddit的,和少年“幽默”并不真正适合很好这里。) –

+0

注意到 我试图改变它,但它说我。必须等待30天 – NorseCode

+0

Bummer:好吧,一个MOD可能会有所帮助,因为你是新手,并且今天只是第一次改变它...尝试标记帖子并要求改变你的名字p eriod重置。我不知道这是否可能,但我认为它会帮助你在社区中的地位。如果失败了,[meta]上有一个有趣的帖子(http://meta.stackexchange.com/questions/54986/name-change-limiting-can-be-broken);不知道这是否仍然有效...... –

回答

5

这是一个有点复杂(如果我没有理解你的要求):

regex = re.compile(
    r"""\b   # Match the start of a word 
    [^\W\d_aeiou]* # Match any number letters except vowels 
    [aeiou]+   # Match one or more vowels 
    [^\W\d_aeiou]* # Match any number letters except vowels 
    \b    # Match the start of a word""", 
    re.VERBOSE|re.IGNORECASE) 

然后,您可以使用它像这样:

>>> regex.findall("A boy named Sue tried to kill a swamp monkey, but failed miserably. He then cried. Boo hoo.") 
['A', 'boy', 'Sue', 'tried', 'to', 'kill', 'a', 'swamp', 'but', 'He', 'then', 'cried', 'Boo', 'hoo'] 

说明:

[^\W\d_aeiou]是有点难以理解:

  • \w匹配任何字母,数字或下划线。
  • \W匹配\w不匹配的任何字符。
  • [^\W]因此与\w相同。但是我们现在可以为这个否定字符类添加更多字符,这些字符类应该从有效字符集中减去。
  • [^\W\d_aeiou]因此匹配\w匹配的任何内容,但不包含数字,下划线或元音。
  • 这种方法(而不是使用[bcdfghjklmnpqrstvwxyz]的好处是,\w是Unicode感知(本身在Python 3,在Python 2请求如果添加re.U标志),因此将不局限于ASCII字母。
+1

如果你添加're.I'国旗,我认为这是完美的! –

+0

谢谢,这完美的作品!如果我不是没有声望点的全新用户,我会提高你的评价。 – NorseCode

+0

@ user3280957:非常欢迎。很高兴在StackOverflow上有你! –

相关问题