Python demo

问题描述 投票:0回答:1
Output

Or as suggested by @anubhava, separate the lookbehind from the lookahead:Regex demo 我试图使用正则表达式查找一个子串的所有出现次数。子串由三部分组成,以一个或多个 "A "开头,然后是一个或多个 "N",最后是一个或多个 "A"。让一个字符串 'AAANAANABNA'

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'

['AAANAA', 'AANA']

'AANA'
python python-3.x regex string-matching python-regex
1个回答
5
投票

但是,我希望输出为。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 "开头,后面是一个或多个 "N",最后是一个或 ...A
  • A+确保没有 A 在左边。
  • N+The N 匹配
  • A+ - 匹配的负面lookbehind的位置,而不是紧接在前面的 A - 一个或多个

sre - 一个或多个

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

4
投票

sre注意您可以使用 A 来获得匹配。

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


4
投票

模块。我们只需要对1个以上的尾部的

(?=(?<!A)(A+N+A+))
  • (?=并必须使用2个捕获组。
    • (?<!A)RegEx演示
    • (A+N+A+)
  • )

有一种选择是在正向看头里面使用一个负向看头,有一个捕获组,但没有重叠。re.findall会返回捕获组的值。 正向看头,断言右边的东西就是 负向看齐,断定左边的不是A

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

匹配你的图案

['AAANAA', 'AANA']

近距离观察Regex演示

© www.soinside.com 2019 - 2024. All rights reserved.