用于查找子字符串的正则表达式

Regular expression for finding a sub-string

我正在尝试使用正则表达式查找所有出现的子字符串。子串由三部分组成,以一个或多个'A'开始,接着是一个或多个'N',以一个或多个'A'结束。让字符串 'AAANAANABNA' 如果我解析字符串我应该得到两个子字符串 'AAANAA''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。 我怎样才能得到它,知道吗?

确保左边没有A

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

(?<!A)A+N+A+ 匹配

  • (?<!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']

一个选项是在没有重叠的正前瞻内使用带有捕获组的负后视。 re.findall 将 return 捕获组的值。

(?=(?<!A)(A+N+A+))
  • (?=正向前瞻,断言右边的是
    • (?<!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

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

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

RegEx Demo