【问题标题】:Python re match two consecutive substrings in logical OR form [duplicate]Python以逻辑或形式重新匹配两个连续的子字符串[重复]
【发布时间】:2018-05-12 03:57:53
【问题描述】:

我正在尝试编写一个匹配字符串的正则表达式

"A","B","AB"

哪个不匹配

"","AA","BB","BA"

我尝试了一个简单的模式

re.search(r'^(A)?(B)?',sample_str)

但是这个模式匹配""。 我知道许多解决方案可以通过对多个模式执行逻辑操作来匹配这个,但是是否可以使用单个模式进行匹配?

提前谢谢你。

【问题讨论】:

  • 我无法弄清楚模式,例如:为什么“AB”可以,而“BA”不行。是不是像你按顺序从“A”和“B”构造一门语言一样?
  • 如果它只接受这些值,为什么不直接比较值呢?
  • 你可以只用re.search(r'A|B|AB', sample_str),但是如果你想找到匹配问题的子串,那么给"AB"可以解释为两个匹配,A和@987654328 @,或匹配AB
  • @Curcuma_ 我无法比较这些值,因为 A 和 B 是包含其他字符的两个字符串块。我试图概括这个问题。
  • 请不要概括到问题没有意义的地步。给出一个你想要匹配的模式的完整例子。

标签: python regex python-2.7


【解决方案1】:

试试这个。从此answer修改了一些正则表达式

regex statement = ^((?=A)A(B?)|(?=B)B)(?!.*(\w)\1)$

__

d = ['A', 'B', 'AB', '', 'AA', 'BB', 'BA']
for n in d:
     t = re.search('^((?=A)A(B?)|(?=B)B)(?!.*(\w)\1)$', n)
     print(t)

<_sre.SRE_Match object; span=(0, 1), match='A'>
<_sre.SRE_Match object; span=(0, 1), match='B'>
<_sre.SRE_Match object; span=(0, 2), match='AB'>
None
None
None
None

【讨论】:

    【解决方案2】:

    看来the anchor(^)需要这样去掉,

    (A)?(B)?
    

    Demo

    如果你想匹配ABAB,那么建议你尝试使用表达式AB|A|BDemo

    【讨论】:

      【解决方案3】:

      您提到当前解决方案的问题是它匹配空字符串。您还提到您不想重复写AB,这是当前解决方案所满足的。

      在这种情况下,您可以通过positive lookahead 排除空匹配项,确保至少有一个字符匹配:

      re.search(r'^(?=.)(A)?(B)?$',sample_str)
      

      我还添加了字符串结尾锚$ 以确保不允许出现尾随字符(您的AABB 示例)。

      查看regex101.com

      当然,这假设无论正则表达式 AB 是什么,它们都不匹配空字符串。

      (我刚刚注意到 Wiktor Stribizew 在 cmets 中提出了类似的方法)

      【讨论】:

        猜你喜欢
        • 2019-01-12
        • 1970-01-01
        • 2015-09-11
        • 1970-01-01
        • 1970-01-01
        • 2018-07-28
        • 1970-01-01
        • 2020-08-24
        • 1970-01-01
        相关资源
        最近更新 更多