我正在尝试编写一个正则表达式,匹配所有单词,以便唯一的元音是e,并且单词中只有三个e ,我在python中写这个。我试着写
(?= e){3}[^aiou]*
但它不起作用。
答案 0 :(得分:6)
你想要三个e,这样两者之间的东西就是非元音。你想要一个单词,即任何一方都有单词边界的东西。
因此:一个单词边界,零个或多个非元音,一个e,零个或多个非元音,一个e,零个或多个非元音,一个e,零个或多个非元音,以及一个单词边界。但我们可以通过对重复模式进行分组来简化:一个单词边界,三次:(零或多个非元音,一个e),零个或多个非元音和一个单词边界。
在正则表达式中说:\b(?:[^aeiou]*e){3}[^aeiou]*\b
。
答案 1 :(得分:2)
最好单独测试这两个部分 首次使用:
^[^aiou]*$
然后使用:
^([^e]*e[^e]*){3}$
答案 2 :(得分:0)
\s[bcdfghjklmnpqrstvwxyz]*e[bcdfghjklmnpqrstvwxyz]*e[bcdfghjklmnpqrstvwxyz]*e[bcdfghjklmnpqrstvwxyz]*\s
答案 3 :(得分:0)
如果你只使用ASCII,我会建议这个解决方案:
(?i)(?=^[^aiouy]*$)^(?:[^e]*e){3}[^e]*$
以下是该模式的演示,从dict
列表中随机选择10个匹配的单词:
% perl -ne 'print if /(?i)(?=^[^aiouy]*$)^(?:[^e]*e){3}[^e]*$/' /usr/share/dict/words |
perl -e '@a = <>; print splice(@a, rand @a, 1) for 1..10'
centgener
geezer
sceptered
gentlemens
neckweed
whenceeer
tenderer
scentlessness
beswelter
entrenchment
是的,我的演示使用Perl,但该模式在Python中也应该没问题。我不像在Perl中那样灵活地使用Python中的单行程序。 :)