如何在Python中使用组合补?

1 投票
2 回答
842 浏览
提问于 2025-04-16 16:52

我在找类似于 r"[^\1]" 的东西,用在Python里。比如说,我想在一段文字中找到像 "hello" 这样的单词,但每个字母都被替换成了其他字母(例如:"a" 被替换成 "z","b" 被替换成 "r",等等)。所以 "hello" 可能变成 "zcuuj""prvva" 等等。我想告诉Python:“帮我找一个以 [a-z] 开头的单词,然后是一个不是第一个字母的字母,再接着是两个相同的字母,最后是一个不同于前面字母的字母。”

我试过这个模式:

r"([a-z])([^\1])([^\1\2]){2}([^\1\2\3])"

(没成功)

还有这个:

r"([a-z])((?!\1))((?!\1|\2)){2}((?!\1|\2|\3])"

(也没成功)

2 个回答

0

根据文档,你可以使用(?P<name>...)来创建一个命名组,这样你以后就可以用(?P=name)来引用它。

1

你可以在这里试试

^([a-z])(?!\1)([a-z])(?!(?:\1|\2))(([a-z])\4)(?!(?:\1|\2|\4))[a-z]

我在网上测试过,可以在这个网站上查看结果

你第二个例子的问题是,负向前瞻断言是非消耗性的。这意味着在检查完字符后,你需要继续处理这些字符。我在每次进行前瞻检查后,都会用.和引用来处理。

你第一个例子的问题是,不能把那些引用放在字符组里面。

更新:我更新了我的正则表达式和rubular链接,因为第一版会允许在第一个字符后出现其他字符,而不仅仅是[a-z]

撰写回答