Python 用于查找子字符串的正则表达式
我正在尝试使用正则表达式查找子字符串的所有出现。子字符串由三部分组成,以一个或多个“A”开头,后跟一个或多个“N”,以一个或多个“A”结尾。让一个字符串'aaanabna',如果我解析这个字符串,我应该得到两个子字符串'AAANAA'和'AANA'作为输出。因此,我尝试了下面的代码Python 用于查找子字符串的正则表达式,python,python-3.x,regex,string-matching,python-regex,Python,Python 3.x,Regex,String Matching,Python Regex,我正在尝试使用正则表达式查找子字符串的所有出现。子字符串由三部分组成,以一个或多个“A”开头,后跟一个或多个“N”,以一个或多个“A”结尾。让一个字符串'aaanabna',如果我解析这个字符串,我应该得到两个子字符串'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)
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']
一种选择是使用负向后看,捕获组位于正向前看中,而不重叠。re.findall将返回捕获组的值
(?=(?<!A)(A+N+A+))
输出
['AAANAA', 'AANA']
或者按照的建议,将“向后看”与“向前看”分开:
(?<!A)(?=(A+N+A+))
(?
|这里有一个使用re
模块实现这一点的简单方法。我们只需要对1+尾随a
s进行前瞻,并且必须使用2个捕获组:
>>> import re
>>> s = 'AAANAANABNA'
>>> [''.join(x) for x in re.findall(r'(A+N+)(?=(A+))', s)]
['AAANAA', 'AANA']
我认为这比第三方regex稍有优势?两者都投了赞成票,我也很喜欢这个问题=)我真的说不出来,您是否考虑过使用regex pypi模块的模式?(?用同样的方法可能会快一点matches@Thefourthbird,感谢您分享精彩的代码和演示,谢谢您加入我们的团队++我从未使用过overlapped=True
,学到了一些新东西++
(?<!A)(?=(A+N+A+))
>>> import re
>>> s = 'AAANAANABNA'
>>> [''.join(x) for x in re.findall(r'(A+N+)(?=(A+))', s)]
['AAANAA', 'AANA']