1

我知道有不同的方法可以做到这一点,但我只想知道为什么我的正则表达式不起作用。这实际上不是我需要做的事情,我只是想看看我是否可以使用正则表达式来做到这一点,我不知道为什么我的代码不起作用。

给定一个字符串 S,我想找到所有包含遵循特定规则的子序列 Q 的非重叠子字符串。现在,假设我正在搜索 subsequence "abc"。我想匹配一个 S 的子字符串,该子字符串包含'a'在某个点'b'后跟在某个点后跟在某个点上,'c'并具有 no'a'跟随'a'和 no'a''b'跟随的限制'b'。我使用的正则表达式如下(在python中):

regex = re.compile(r'a[^a]*?b[^ab]*?c')
match = re.finditer(regex, string)

for m in match:
    print m.group(0)

对我来说,这分解并如下所示:

a[^a]*?b:'a'后跟不包括'a'并以 a 结尾'b'
[^ab]*?c的最小字符数 : 不包括'a'or'b'并以 a 结尾的最小字符数'c'

所以把这一切放在一起,我假设我会匹配 S 的非重叠子串,其中包含符合我的排除规则的子序列“abc”。

适用于以下情况:

S = "aqwertybwertcaabcc",这给了我"aqwertybwertc""abc"

但它无法为 工作S = "abbc",因为它与 匹配"abbc"

4

2 回答 2

3

假设您真正想要的是子序列 Q 在第一个和第一个之间不包含s a,并且在第一个和第一个之后的第一个和第一个之间不包含s 或s ,要使用的正确正则表达式是:ababbcb

r'a[^ab]*b[^abc]*c'

您当前使用的正则表达式将尽其所能在字符串上取得成功,包括将文字与 first 之后的ba匹配,这就是匹配的原因。只有在第一个字符类中明确排除才能避免这种情况,并且只匹配.之后的第一个字符。bb"abbc"bbba

于 2013-10-26T23:13:26.027 回答
0

如果您查看逆类,它可能会有所帮助。
在所有情况下abc都是微不足道的解决方案。
而且,在这种情况下,非贪婪可能不适用,因为
示例逆类中使用了固定的字符集。

 #  Type 1 :
 #  ( b or c can be between A,B )
 #  ( a or b can be between B,C )
 # ------------------------------
 a                    #  'a'              
 [b-z]*?              #  [^a]
 b                    #  'b'
 [abd-z]*?            #  [^c]
 c                    #  'c'


 #  Type 2, yours :
 #  ( b or c can be between A,B )
 #  ( c can be between B,C )
 # ------------------------------
 a                    #  'a'              
 [b-z]*?              #  [^a]
 b                    #  'b'
 [c-z]*?              #  [^ab]
 c                    #  'c'


 #  Type 3 :
 #  ( c can be between A,B )
 # ------------------------------
 a                    #  'a'              
 [c-z]*?              #  [^ab]
 b                    #  'b'
 [d-z]*?              #  [^abc]
 c                    #  'c'


 #  Type 4 :
 #  ( distinct A,B,C ) :
 # ------------------------------
 a                    #  'a'              
 [d-z]*?              #  [^abc]
 b                    #  'b'
 [d-z]*?              #  [^abc]
 c                    #  'c'
于 2013-10-27T00:09:15.043 回答