2017-06-01 40 views
1

这里的骨感:你如何使一个字符集匹配不是一个以前被捕获的字符?想你知道Python RE吗?这里是一个挑战

r'(.)[^\1]' # doesn't work 

这是呃......胖?它是(简单)加密程序的一部分。假设“hobo”被编码为“fxgx”。该方案只得到了编码的文本,有推测它可能是什么,所以它产生的模式:

r'(.)(.)(.)\2' # 1st and 3rd letters *should* be different! 

现在它(正确)匹配“流浪汉”,也符合“HOHO”(想想吧!)。我试过的东西,如:

r'(.)([^\1])([^\1\2])\2' # also doesn't work 

MANY的改变,但是唉!啪...

请帮忙!

P.S.解决方法(我必须实现)只是检索“hobo”以及“hoho”,然后只是过滤结果(丢弃“hoho”s),if你明白我的意思;)

PPS现在我想HOHO

VVVVV答案VVVVV

是的,我重新 -re-阅读文档,它并说:

在字符类的'['和']'内部,所有数字转义字符都是 作为字符对待。

除了:

特殊字符失去里面套了特殊的意义。

其中相当多的手段(我认为)不,你不能做任何事情一样:

re.compile(r'(.)[\1]') # Well you can, but it kills the back-reference! 

感谢您的帮助!

+1

使用包含反向引用的负向前视。 – Barmar

+0

您正在使用错误的工具完成任务。在方括号中加入反向引用是错误的。 –

+0

要匹配一个字符串与所有不同的字母,你应该使用一个集合,并检查不同字符的计数。用正则表达式,你可能会实现它,但随着任意数量的字符只是一个矫枉过正。要匹配以3个不同字母开头的单词,请使用're.match(r'([az])(?!\ 1)([az])(?!\ 1 | \ 2)([az])' ,s)' –

回答

3

第一个和第三个字母应该不一样!

这不能使用正则表达式(不只是python的实现)检测到。更具体地说,不能使用没有存储器的自动机来检测。你将不得不使用不同类型的自动机。

你试图发现的语法类型(重叠)不规则。而且,它不是上下文无关的。

自动机是允许正则表达式匹配如此高效的机制。

+0

不知道自动机的含义是什么,但是你是对的,不能用Python re做 – user1547581

+0

你不能用任何正则表达式实现它。不仅仅是Python。 –

+0

@ user1547581自动机是允许正则表达式匹配如此高效的机制。 –