Python:返回完整的单词而不仅仅是String的特定部分(正则表达式)

时间:2014-02-06 18:53:37

标签: python regex

我刚刚开始学习Python,而且我已经像正则表达式那样“远”了。我的任务似乎很简单。我只需要编写一个正则表达式,从String返回某些单词。规则如下:该单词只能包含一组元音。换句话说,它是一个不完美但简单的正则表达式,用于从文本中返回一个音节词。

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

>>> 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.']

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

提前致谢!

1 个答案:

答案 0 :(得分: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中原生,如果添加re.U标志,请在Python 2中通过请求)因此不限于ASCII字母。