请考虑以下示例字符串:
abc1235abc53abcXX
123abc098YXabc
我想捕获abc之间发生的组,
e.g。我应该得到以下几组:
1235, 53, XX
123, 098YX
我正在尝试这个正则表达式,但不知何故它没有捕获中间文本:
(abc(.*?))+
我做错了什么?
编辑:我需要使用正则表达式,没有字符串拆分,因为我需要对捕获的组应用更多规则。
答案 0 :(得分:5)
re.findall()
采用特定的正则表达式模式:
import re
strings = ['abc1235abc53abcXX', '123abc098YXabc']
pat = re.compile(r'(?:abc|^)(.+?)(?=abc|$)') # prepared pattern
for s in strings:
items = pat.findall(s)
print(items)
# further processing
输出:
['1235', '53', 'XX']
['123', '098YX']
(?:abc|^)
- 未捕获的组,以匹配abc
子字符串OR 字符串的开头 ^
(.+?)
- 捕获的组以尽可能少地匹配任何字符序列(?=abc|$)
- 前瞻性肯定断言,确保前一个匹配项后跟abc
序列或字符串结束 $
答案 1 :(得分:3)
使用re.split:
import re
s = 'abc1235abc53abcXX'
re.split('abc', s)
# ['', '1235', '53', 'XX']
请注意,您会收到一个空字符串,表示第一个' abc'之前的匹配。
答案 2 :(得分:0)
尝试按abc
分割字符串,然后使用if
理解中的list
语句删除空结果,如下所示:
[r for r in re.split('abc', s) if r]