用于查找子字符串的正则表达式
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+
- 一个或多个 A
s
N+
- 一个或多个 N
s
A+
- 一个或多个 A
s
请注意,您也可以使用 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+)
匹配你的模式
)
关闭前瞻
import re
s = "AAANAANABNA"
pattern = r"(?=(?<!A)(A+N+A+))"
print(re.findall(pattern, s))
输出
['AAANAA', 'AANA']
或者按照 @anubhava 的建议,将后瞻与前瞻分开:
(?<!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']
我正在尝试使用正则表达式查找所有出现的子字符串。子串由三部分组成,以一个或多个'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+
- 一个或多个A
sN+
- 一个或多个N
sA+
- 一个或多个A
s
请注意,您也可以使用 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+)
匹配你的模式
)
关闭前瞻
import re
s = "AAANAANABNA"
pattern = r"(?=(?<!A)(A+N+A+))"
print(re.findall(pattern, s))
输出
['AAANAA', 'AANA']
或者按照 @anubhava 的建议,将后瞻与前瞻分开:
(?<!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']