0

我正在尝试使用正则表达式模式来匹配字符串中的所有 A.. 组,直到下一个 A.(Python)

例如:DFDAXDJSDSJDAFGCJASDJASAGXCJAD 转化为:

'AXDJSDSJD'
'AFGCJ'
'ASDJ'
'AS'
'AGXCJ'
'AD'

我想出的最接近的事情是:

string="DFDAXDJSDSJDAFGCJASDJASAGXCJAD"
r=re.compile('(A.[!=A]*)+')
matchObj = r.findall(string, re.M|re.I)

返回AF, AS, ASA, AD

为什么会跳过第一个?为什么直到下一个 A 才返回所有字符?

4

2 回答 2

2

您可以将字符串拆分A为:

>>> s = "DFDAXDJSDSJDAFGCJASDJASAGXCJAD"
>>> s.split('A')
['DFD', 'XDJSDSJD', 'FGCJ', 'SDJ', 'S', 'GXCJ', 'D']

# add a leading `A` to each match 'on the fly'
>>> [ 'A%s' % s for s in  s.split('A') ]
['ADFD', 'AXDJSDSJD', 'AFGCJ', 'ASDJ', 'AS', 'AGXCJ', 'AD']

或使用可选的正向前瞻

>>> re.findall('(A[^A]+(?=A)?)', s, re.IGNORECASE | re.MULTILINE)
['AXDJSDSJD', 'AFGCJ', 'ASDJ', 'AS', 'AGXCJ', 'AD']

或者简单地说(如果你不关心下一个 A - 这相当于说它是可选的):

>>> re.findall('(A[^A]+)', s, re.IGNORECASE | re.MULTILINE)
['AXDJSDSJD', 'AFGCJ', 'ASDJ', 'AS', 'AGXCJ', 'AD']
于 2013-06-01T13:47:20.290 回答
2

我可以提出以下方法:

string="DFDAXDJSDSJDAddaFGCJASDJASAGXCJAD"
r=re.compile('A[^A]*', re.I|re.M)
matchObj = r.findall(string)
matchObj
于 2013-06-01T13:51:30.997 回答