Python正则表达式,捕获非特定的组

时间:2018-04-16 11:28:13

标签: python regex

请考虑以下示例字符串:

abc1235abc53abcXX

123abc098YXabc

我想捕获abc之间发生的组,

e.g。我应该得到以下几组:

1235, 53, XX
123, 098YX

我正在尝试这个正则表达式,但不知何故它没有捕获中间文本:

(abc(.*?))+

我做错了什么?

编辑:我需要使用正则表达式,没有字符串拆分,因为我需要对捕获的组应用更多规则。

3 个答案:

答案 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]