【问题标题】:Regular expression in Python two letters preceding and succeeding different letterPython中的正则表达式在不同字母之前和之后的两个字母
【发布时间】:2019-09-05 13:39:39
【问题描述】:

我需要在 Python 中生成以下正则表达式:

字母表 {a,b} 中所有字符串的集合,其中每个 a 的前面和后面都有 2 个 b。下面我生成了长度为 0 到 4 的有效字符串

有效字符串:[空字符串]、b、bb、bbb、bbbb、bbab等

无效字符串:a、ba、ab、bba、bbab

我的 reg 表达式目前是:“(b|bbabb)+”,它匹配除空字符串之外的所有内容,但由于我想支持空字符串,我将“+”替换为“*”,现在一些原因是为这个字母表中从 1 到 4 的每个字符串(到目前为止我只测试了长度为 4 的字符串)生成一个匹配项。它为以下内容提供匹配项:

{a, b, aa, bb, ab, ba, aaa, bbb, etc..} 即使对于任何具有 a 的字符串都应该失败,其中每个 a 前面没有 2 个 b 并且后面没有2个b的

def alphaf():
    return "(b|bbabb)*"



regex = alphaf()


p = re.compile(regex)
#Below are the test strings

test = 'a'
match = p.match(test)
if match is None:
    print('No Match: {0}'.format(test))
else:
    print('Match: {0}'.format(test))

test = 'b'
match = p.match(test)
if match is None:
    print('No Match: {0}'.format(test))
else:
    print('Match: {0}'.format(test))

test = 'bbabb'
match = p.match(test)
if match is None:
    print('No Match: {0}'.format(test))
else:
    print('Match: {0}'.format(test))

test = 'abb'
match = p.match(test)
if match is None:
    print('No Match: {0}'.format(test))
else:
    print('Match: {0}'.format(test))

test = 'bba'
match = p.match(test)
if match is None:
    print('No Match: {0}'.format(test))
else:
    print('Match: {0}'.format(test))

test = 'bbbab'
match = p.match(test)
if match is None:
    print('No Match: {0}'.format(test))
else:
    print('Match: {0}'.format(test))

test = 'bbbabb'
match = p.match(test)
if match is None:
    print('No Match: {0}'.format(test))
else:
    print('Match: {0}'.format(test))

test = ''
match = p.match(test)
if match is None:
    print('No Match: {0}'.format(test))
else:
    print('Match: {0}'.format(test))

【问题讨论】:

  • 你所拥有的只是一个“原始字符串”,而不是任何可以进行正则表达式搜索的东西。当然,这不可能是您的全部代码,因为 return 必须在函数中。另外,我不确定您是否向我们提供了完整的问题描述。是不是像这样:“给定一个列表 if 字符串(或多行字符串),返回那些包含 a 的字符串(或行),后面跟着两个 b's?或类似的东西?跨度>
  • 是的,就是这样,我只需要生成生成它的正则表达式,感谢您注意到我会更改它。是的,基本上如果有一个“a”,它需要被前后两个“b”包围
  • 更新您的问题并展示更多工作(这就是您被否决的原因)。
  • 好的,我尽快回来。我更新了问题。所以我删除了'r',它除了空字符串外一切正常,但是当我用kleenee星替换“+”时,现在它匹配每个字符串甚至'a',即使'a'不在组中: (b|bbabb)
  • 使用原始字符串没有任何问题。运行 Python,当你得到>>> 提示符时,输入'\n'r'\n' 看看区别。

标签: python regex string


【解决方案1】:

正则表达式应该是:^(b*((?<=bb)a(?=bb))?)+$:

  1. ^ 匹配字符串的开头。从技术上讲,这不是必需的,因为 match 函数会强制匹配从字符串的开头开始(与 search 函数不同)。
  2. b* 匹配 0 个或多个 b 字符。
  3. ((?<=bb)a(?=bb))? 是一个可选组,如果 if 前面有两个 b 字符,后面有两个 b 字符,则匹配 a
  4. + 项目 2. 和 3. 可能匹配,例如,bbbbbba(如果后者后跟 bb)可能会重复多次。
  5. '$' 匹配字符串的结尾。

See Demo

一些进一步的解释:

在我的正则表达式中,空字符串 (b*) 多次 (+) 仍然是空字符串,即 b*b* 仍然匹配空字符串。所以那里没有问题。

在你的正则表达式中,当你有模式bbabb+bbabb 多次)和字符串bbabbabb,第一次你将首先匹配bbabb。但这会在输入字符串中留下不匹配的 abb 以进行下一次匹配。但是当您尝试进行下一个匹配时,您无法将模式bbabbabb 匹配。您的模式仅适用于与bbabbbbabbbbabbbbabb 完全相同的字符串,即字符串bbabb 连接在一起。

+ 运算符每次重复的正则表达式仅匹配 b 字符的字符串,如果前面有两个 b 字符,则可选 a(这是 lookbehind 测试:(?<=bb))后跟两个 b 字符(这是 lookahead 测试:(?=bb))。但它实际上并不匹配以下两个b 字符。它使字符串中的这些字符在+ 的下一次重复中不匹配。

因此,给定字符串 bbabbabb 和我的正则表达式,+ 运算符的每次重复都会连续匹配以下子字符串:

  • bba(匹配 b*a?,因为满足 a? 的后向和前向条件)
  • bba(匹配 b*a?,因为满足 a? 的后向和前向条件)
  • bb(找不到以下可选a

【讨论】:

  • 不,对不起,我没有正确解释。首先它不接受空字符串(我的错误来自说明)。 2.它接受的不仅仅是'bbabb',基本上如下。它可以有任意数量的 b。对你所做的事情的唯一限制是放在“a”上。如果有一个'a',则它的前后必须有两个b。只要这两个条件成立,字符串就有效。有效字符串例如:'b'、'bbbbbabb'、bbabbbbb'。无效:'a'、'ba'、'ab'、'abb'。它们是无效的,因为每个 a 在每个“a”的两侧都没有 2 个 b。谢谢你,很抱歉给你带来了困惑。
  • 我已根据您的最新评论修改了我的答案。我假设 bbbabbbabb 是一个有效的字符串。
  • 为什么 b* 不与表达式外部的 '+' 冲突?那不会留下空字符串的可能性吗?我想我不明白订单是如何运作的。我认为 (b+|bbabb+)+ 将被描述如下:外部加号使您选择组的任何一部分,因此对于长度为 1 的字符串,您选择 'b',现在由于 + 允许您再次添加,您可以选择另一个'b'来产生'bb',或者你可以选择'bbbabb'(bbabb从字符串长度1添加到初始b)。使用该表达式,它不支持该语言中的每个字符串吗?任意 # 个 b,它限制 a。
  • 我用一些进一步的解释更新了答案。
猜你喜欢
  • 2016-07-15
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 2017-06-28
相关资源
最近更新 更多