2016-09-17 112 views
0

我是一名Java开发人员,也是Python的新手。我想定义一个正则表达式接受所有的字母字符,除了其中的一些。我想排除元音和字符'y',无论是大写还是小写。Python版本的Java正则表达式?

Java中的正则表达式这将是如下:

"[a-zA-Z&&[^aeiouyAEIOUY]]" 

如何我(重新)将其定义为在Python?上述对Python显然不起作用。而且我也像下面的方式进行提示:

"[bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ]" 
+0

您是否尝试从您的Java代码中删除'&&'? –

回答

2

我不认为目前的蟒蛇正则表达式模块有你在寻找什么。最终的替代regex确实有你所需要的,你可以根据自己的意愿安装它。

除此之外,否定可能是一条路。基本上,定义你不想要的所有字符,然后反转。听起来很伤感,但“非字”速记(\W)可以帮助我们。 \w表示a-zA-Z0-9_(用于ASCII匹配),而\W表示相反(​​)。因此,[aeiouyAEIOUY\W\d_]意味着你不想找的每个角色,所以[^aeiouyAEIOUY\W\d_]意味着你正在寻找的每个角色。例如。

>>> import re 
>>> s = "xyz_ d10 word" 
>>> pattern = "[^aeiouyAEIOUY\W\d_]+" 
>>> re.findall(pattern, s) 
['x', 'z', 'd', 'w', 'rd'] 

如果您严格按照ASCII字符,那么您可以使用ASCII标志。例如。

>>> s = "Español" 
>>> re.findall(pattern, s) 
['sp', 'ñ', 'l'] 
>>> re.findall(pattern, s, re.ASCII) 
['sp', 'l'] 
0

(?i)[b-df-hj-np-tv-xz](?i)\w(?<![_aeiouy\d])。测试here

0

(?= ...)积极的前瞻断言。如果包含的 正则表达式(此处用...表示)成功匹配当前位置的 ,则会成功,否则将失败。但是,一旦试用了包含的 表达式,匹配引擎根本没有进展; 模式的其余部分在断言开始的地方被尝试。

(?!...)否定性超前断言。这与 积极主张相反;如果包含的表达式不是 匹配字符串中的当前位置,它会成功。

r"(?![aeiouyAEIOUY])[a-zA-Z])" 
+0

我发现这种方法在尝试匹配多个字符时遇到了问题。试试:'re.findall(r“((?![aeiouyAEIOUY])[a-zA-Z])+”,“string”)'。我期望'['str','ng']',但它会产生'['r','g']'。 – Dunes

+0

@Dunes使用非捕获的'(?:..)'而不是'(...)'。整行:'re.findall(r“(?:(?![aeiouyAEIOUY])[a-zA-Z])+”,“string”)'。试试简单的'[bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ]',你会得到相同的结果。 '['r','g']'结果是正确的,但这个评论可能太短而无法解释。仔细阅读文档。这是两个匹配的组。基本上第一场比赛是's'然后't'然后'r',第二场比赛是'n'然后'g'。新的比赛覆盖旧的比赛。 – VPfB