我有两个正则表达式,一个匹配所有字符[a-z],另一个排除以下字符[^spuz(ih)]组合(字符s, p, u, z, ih),我如何将这两个字符组合在一起,以便允许除列出的字符外的所有字母数字字符在第二个RE?

(re.match(r'^[a-z]*(?![spuz]|ih)[a-z]s$', insert_phrase)

最佳答案

您不能这样“组合”它们,但是您可以编写另一个具有相同作用的正则表达式。为此,您可以使用(?!)构造。仅当其中的正则表达式与以下部分不匹配时,它才匹配0个字符。因此,您可以使用:

'(?![spuz(ih)])[a-z]'


或者,由于这不是您想要的,请将其更改为:

'(?![spuz]|ih)[a-z]'


在更改的问题中,您似乎想要反面查找。这会将模式变成:

'^[a-z]*(?<![a-z][spuz]|ih)s$'


注意后面的部分中的额外[a-z]。这是必需的,因为后向表达式必须为固定宽度。这意味着像“ ps”这样的字符串将与模式匹配,但是您不希望那样。因此,相反,最好使用两个单独的lookbehinds(要使字符串匹配,两个都必须为真):

'^[a-z]*(?<![spuz])(?<!ih)s$'

09-20 08:18