【问题标题】:Regular expression for finding a sub-string用于查找子字符串的正则表达式
【发布时间】:2020-10-06 12:52:06
【问题描述】:

我正在尝试使用正则表达式查找子字符串的所有出现。子串由三部分组成,以一个或多个'A'开始,后接一个或多个'N',以一个或多个'A'结束。让一个字符串 'AAANAANABNA' ,如果我解析字符串,我应该得到两个子字符串 'AANA''AANA' 作为输出.所以,我尝试了下面的代码。

import regex as re
reg_a='A+N+A+'
s='AAANAANABNA'
sub_str=re.findall(reg_a,s,overlapped=True)
print(sub_str)

而且,我得到以下输出,

['AAANAA', 'AANAA', 'ANAA', 'AANA', 'ANA']

但是,我希望输出为,

['AAANAA', 'AANA']

也就是说,第一个匹配的尾随 A 应该是下一个匹配的前导 A。 我怎样才能得到它,知道吗?

【问题讨论】:

    标签: python python-3.x regex string-matching python-regex


    【解决方案1】:

    一种选择是在没有重叠的情况下在正向前瞻内使用带有捕获组的否定后向查看。 re.findall 将返回捕获组的值。

    (?=(?<!A)(A+N+A+))
    
    • (?= 正向前瞻,断言右边是
      • (?&lt;!A)负前瞻,断言左边不是A
      • (A+N+A+) 匹配你的模式
    • ) 关闭前瞻

    Regex demo | Python demo

    import re
    s = "AAANAANABNA"
    pattern = r"(?=(?<!A)(A+N+A+))"
    print(re.findall(pattern, s))
    

    输出

    ['AAANAA', 'AANA']
    

    或者按照@anubhava 的建议,将后瞻与前瞻分开:

    (?<!A)(?=(A+N+A+))
    

    Regex demo | Python demo

    【讨论】:

    • 我认为这比第 3 方正则表达式略有优势?两者都赞成,我也很喜欢这个问题=)
    • 我真的不知道,你有没有使用正则表达式 pypi 模块的模式?
    • (?&lt;!A)(?=(A+N+A+)) 使用相同的匹配可能会更快一些
    • @Thefourthbird,感谢您分享漂亮的代码和演示欢呼
    【解决方案2】:

    这是使用re 模块实现此目的的更简单方法。我们只需要对 1+ 个尾随 As 进行前瞻,并且必须使用 2 个捕获组:

    >>> import re
    >>> s = 'AAANAANABNA'
    >>> [''.join(x) for x in re.findall(r'(A+N+)(?=(A+))', s)]
    ['AAANAA', 'AANA']
    

    RegEx Demo

    【讨论】:

    • 很高兴加入小组 ++
    【解决方案3】:

    确保左侧没有A

    >>> reg_a='(?<!A)A+N+A+'
    >>> print( re.findall(reg_a,s,overlapped=True) )
    ['AAANAA', 'AANA']
    

    (?&lt;!A)A+N+A+ 匹配

    • (?&lt;!A) - 与A 前面没有紧接的位置相匹配的否定后视
    • A+ - 一个或多个As
    • N+ - 一个或多个 Ns
    • A+ - 一个或多个 As

    请注意,您也可以使用 re 来获取匹配项:

    >>> import re
    >>> re_a = r'(?=(?<!A)(A+N+A+))'
    >>> print( re.findall(re_a, s) )
    ['AAANAA', 'AANA']
    

    【讨论】:

    • 我从没用过overlapped=True,学到了一些新东西。 ++
    猜你喜欢
    • 1970-01-01
    • 2016-05-16
    • 2012-05-12
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多