Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用于查找子字符串的正则表达式_Python_Python 3.x_Regex_String Matching_Python Regex - Fatal编程技术网

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

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)

我正在尝试使用正则表达式查找子字符串的所有出现。子字符串由三部分组成,以一个或多个“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)
我得到了下面的输出

['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']