我是一名Java开发人员,也是Python的新手。我想定义一个正则表达式接受所有的字母字符,除了其中的一些。我想排除元音和字符'y',无论是大写还是小写。Python版本的Java正则表达式?
Java中的正则表达式这将是如下:
"[a-zA-Z&&[^aeiouyAEIOUY]]"
如何我(重新)将其定义为在Python?上述对Python显然不起作用。而且我也不像下面的方式进行提示:
"[bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ]"
我是一名Java开发人员,也是Python的新手。我想定义一个正则表达式接受所有的字母字符,除了其中的一些。我想排除元音和字符'y',无论是大写还是小写。Python版本的Java正则表达式?
Java中的正则表达式这将是如下:
"[a-zA-Z&&[^aeiouyAEIOUY]]"
如何我(重新)将其定义为在Python?上述对Python显然不起作用。而且我也不像下面的方式进行提示:
"[bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ]"
我不认为目前的蟒蛇正则表达式模块有你在寻找什么。最终的替代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']
像(?i)[b-df-hj-np-tv-xz]
或(?i)\w(?<![_aeiouy\d])
。测试here。
(?= ...)积极的前瞻断言。如果包含的 正则表达式(此处用...表示)成功匹配当前位置的 ,则会成功,否则将失败。但是,一旦试用了包含的 表达式,匹配引擎根本没有进展; 模式的其余部分在断言开始的地方被尝试。
(?!...)否定性超前断言。这与 积极主张相反;如果包含的表达式不是 匹配字符串中的当前位置,它会成功。
r"(?![aeiouyAEIOUY])[a-zA-Z])"
我发现这种方法在尝试匹配多个字符时遇到了问题。试试:'re.findall(r“((?![aeiouyAEIOUY])[a-zA-Z])+”,“string”)'。我期望'['str','ng']',但它会产生'['r','g']'。 – Dunes
@Dunes使用非捕获的'(?:..)'而不是'(...)'。整行:'re.findall(r“(?:(?![aeiouyAEIOUY])[a-zA-Z])+”,“string”)'。试试简单的'[bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ]',你会得到相同的结果。 '['r','g']'结果是正确的,但这个评论可能太短而无法解释。仔细阅读文档。这是两个匹配的组。基本上第一场比赛是's'然后't'然后'r',第二场比赛是'n'然后'g'。新的比赛覆盖旧的比赛。 – VPfB
您是否尝试从您的Java代码中删除'&&'? –