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

标签 python regex

我最近刚刚开始学习 Python,并且已经“深入”到了正则表达式。我的任务看起来相当简单。我只需要编写一个从字符串返回某些单词的正则表达式。规则如下:单词只能包含一组元音。换句话说,它是一个不完美但简单的正则表达式,旨在从文本中返回一个音节单词。

我相信我编写的正则表达式并不算太远,但我只得到了字符串的一部分,而不是完整的单词。下面的例子:

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

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

提前致谢!

最佳答案

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

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 字母。

关于Python:返回完整单词而不仅仅是字符串的特定部分(正则表达式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21611512/

相关文章:

java - 用于查找引号之间匹配项的正则表达式

regex - 如何使用 bash 脚本格式化这些数据

python - 从 python 程序执行带符号的 shell 脚本

python - 如何在不同节点训练独立的keras模型(尴尬的并行工作负载)

python - 在 Numpy 中将 sRGB 向量化为线性转换

python - 如何使用 webbrowser 模块在现有浏览器窗口中打开 URL?

javascript - 从字符串中删除特殊字符(HTML 标记内的特殊字符除外)

python - 在 JSON/Python 中删除 twitter 扩展推文列的不必要的详细信息

ios - XCode搜索:如何创建Matches Regex(正则表达式)以选择正确的文件

python - 声音文件的值列表