Java正则表达式的Python版本?

Java正则表达式的Python版本?,python,regex,Python,Regex,我是一名Java开发人员,对Python不熟悉。我想定义一个正则表达式,它接受除部分字符外的所有字母字符。我只想排除元音和字符“y”,不管是大写还是小写 它的Java正则表达式如下所示: "[a-zA-Z&&[^aeiouyAEIOUY]]" 如何(重新)将其定义为Python?显然,上述方法不适用于Python。我也不喜欢以下模式: "[bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ]" 如(?i)[b-df-hj-np-tv-xz]或(

我是一名Java开发人员,对Python不熟悉。我想定义一个正则表达式,它接受除部分字符外的所有字母字符。我只想排除元音和字符“y”,不管是大写还是小写

它的Java正则表达式如下所示:

 "[a-zA-Z&&[^aeiouyAEIOUY]]"
如何(重新)将其定义为Python?显然,上述方法不适用于Python。我也不喜欢以下模式:

"[bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ]"
(?i)[b-df-hj-np-tv-xz]
(?i)\w(?测试。

(?i)[b-df-hj-np-tv-xz]
(?i)\w(?测试

(?=…)正向前瞻断言。如果包含 正则表达式(此处由…表示)成功匹配 当前位置,否则将失败。但是,一旦 表达式已尝试,匹配引擎根本无法前进; 模式的其余部分将在断言开始的地方进行尝试

(?!…)消极前瞻断言。这与 肯定断言;如果所包含的表达式不存在,则会成功 在字符串中的当前位置进行匹配

(?=…)正向前瞻断言。如果包含 正则表达式(此处由…表示)成功匹配 当前位置,否则将失败。但是,一旦 表达式已尝试,匹配引擎根本无法前进; 模式的其余部分将在断言开始的地方进行尝试

(?!…)消极前瞻断言。这与 肯定断言;如果所包含的表达式不存在,则会成功 在字符串中的当前位置进行匹配


我认为当前的python正则表达式模块并不完全符合您的要求。最终的替代品确实满足您的需要,您可以根据需要安装它

除此之外,否定可能是一种方法。基本上,定义所有你不想要的字符,然后将其倒置。听起来很费力,但“非单词”速记(
\W
)可以帮助我们解决问题。
\W
表示
a-zA-Z0-9
(对于ASCII匹配),而
\W
表示相反的意思(
[^\W]
)因此,
[aeiouyaeouy\W\d\uuuuuy]
意味着你没有寻找的每一个字符,因此
[^aeiouyaeouy\W\d\uuuuy]
意味着你正在寻找的每一个字符

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

我认为当前的python正则表达式模块并不完全符合您的要求。最终的替代品确实满足您的需要,您可以根据需要安装它

除此之外,否定可能是一种方法。基本上,定义所有你不想要的字符,然后将其倒置。听起来很费力,但“非单词”速记(
\W
)可以帮助我们解决问题。
\W
表示
a-zA-Z0-9
(对于ASCII匹配),而
\W
表示相反的意思(
[^\W]
)因此,
[aeiouyaeouy\W\d\uuuuuy]
意味着你没有寻找的每一个字符,因此
[^aeiouyaeouy\W\d\uuuuy]
意味着你正在寻找的每一个字符

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

您是否尝试从Java代码中删除
&
?您是否尝试从Java代码中删除
&
?我发现这种方法在尝试匹配多个字符时遇到问题。请尝试:
re.findall(r)((?![aeiouyaeouy])[a-zA-Z])+,“string”)
。我希望
['str ng']
,但它会产生
['r',g']
@Dunes使用非捕获的
(?:…)
而不是
(…)
。整行:
re.findall(r)(?:(?![aeiouyaeouy])[a-zA-Z])+,“string”)
。尝试使用简单的
[bcdfghjklmnpqrstvwwxzbcdfghjklmpqrstvwwxz]
,您会得到相同的结果。
,['r',['g']
结果是正确的,但此注释可能太短,无法解释。请仔细阅读文档。这是两个匹配组。基本上,第一个匹配是's'然后是't'然后是'r',第二个匹配是'n'然后是'g'。新匹配覆盖了旧匹配。我发现这种方法在尝试匹配多个字符时遇到问题字符尝试:
re.findall(r)((?![aeiouyaeouy])[a-zA-Z])+,“string”)
。我希望
['str','ng']
,但它会导致
['r','g']
@Dunes使用非捕获
(?:…)
而不是
(…)
。整行:
re.findall(r)(?:(?![aeiouyza])
。尝试使用简单的
[bcdfghjklmnpnpqrstvwxzbcdfghjklmnpqrstvwxz]
会得到相同的结果。
['r','g']
结果是正确的,但此注释可能太短,无法解释。请仔细阅读文档。这是两个匹配组。基本上,第一个匹配是“s”,然后是“t”,然后是“r”,第二个匹配是“n”,然后是“g”。新匹配覆盖了旧匹配。