【发布时间】:2018-04-16 11:28:12
【问题描述】:
考虑以下示例字符串:
abc1235abc53abcXX
123abc098YXabc
我想捕获发生在 abc 之间的组,
例如我应该得到以下组:
1235, 53, XX
123, 098YX
我正在尝试这个正则表达式,但不知何故它没有捕获中间文本:
(abc(.*?))+
我做错了什么?
编辑:我需要使用正则表达式来完成,没有字符串拆分,因为我需要对捕获的组应用更多规则。
【问题讨论】:
考虑以下示例字符串:
abc1235abc53abcXX
123abc098YXabc
我想捕获发生在 abc 之间的组,
例如我应该得到以下组:
1235, 53, XX
123, 098YX
我正在尝试这个正则表达式,但不知何故它没有捕获中间文本:
(abc(.*?))+
我做错了什么?
编辑:我需要使用正则表达式来完成,没有字符串拆分,因为我需要对捕获的组应用更多规则。
【问题讨论】:
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 子字符串或 字符串的开头 ^
(.+?) - 捕获组以尽可能少地匹配任何字符序列(?=abc|$) - 前瞻肯定断言,确保前一个匹配项后跟 abc 序列或 字符串结尾 $ 【讨论】:
使用re.split:
import re
s = 'abc1235abc53abcXX'
re.split('abc', s)
# ['', '1235', '53', 'XX']
请注意,您会得到一个空字符串,表示第一个 'abc' 之前的匹配项。
【讨论】:
尝试通过abc 拆分字符串,然后使用if 中的if 语句删除空结果,如下所示:
[r for r in re.split('abc', s) if r]
【讨论】: