我刚刚开始学习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.']
如您所见,结果不正确。它只是拆分字符串以适合我的正则表达式,而不是返回它来自的单词。此外,返回的一些字符串甚至不符合我的标准。
提前致谢!
答案 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字母。