Python迭代RegEx,从分隔符

时间:2015-11-23 01:50:41

标签: python regex string

我有一个正则表达式函数,它从两个预定义的分隔符(开始和结束)之间提取字符串元素:

def Findy(start, end, anystring):
    result = (anystring.split(start)[1].split(end)[0])
    return result

string = "I want A and I want B and I want C and..."
Findy('want', 'and', string)
>>>'A'

但这只能抓住它找到的第一场比赛;我需要的是得到所有的比赛,所以;

Findy('want', 'and', string)
>>>['A','B','C']

我尝试合并re.findall,但我并不总是知道我的开始和结束分隔符之间存在什么样的模式,所以那里没有运气。

如何重构Findy迭代字符串并获取所有匹配项?

3 个答案:

答案 0 :(得分:3)

使用带有后视和前瞻的正则表达式:

>>> import re
>>> string = "I want A and I want B and I want C and..."
>>> re.findall(r'(?<=want ).*?(?= and)', string)
['A', 'B', 'C']

如何运作

正则表达式分为三个部分:

  • (?<=want )

    仅当前面带有字符串want时才匹配。

  • .*?

    这匹配任何字符。尾随?使得此匹配非贪婪。这意味着它找到满足整体正则表达式的最短字符串。

  • (?= and)

    仅当字符串中的此点后跟and时才匹配。

单独并供将来参考,请注意string是标准模块的名称,最佳做法是不选择可能与标准模块冲突的变量名称。

替代

正如AvinashRaj指出的那样,我们也可以使用捕获组而不是后视,前瞻组合来做到这一点:

>>> re.findall(r'\bwant\s+(.*?)\s+and\b', string)
['A', 'B', 'C']

答案 1 :(得分:1)

不知道此代码是否满足您:

def findy(start, end, anystr):
    res = []
    tmp = anystr.split(start)[1:]
    for e in tmp:
        res.append(e.split(end)[0].strip())
    return res

答案 2 :(得分:1)

这是一个重新定义Findy的脚本:

margin

输出:from __future__ import print_function import re def Findy(start, end, anystring): pattern = '{}(.*?){}'.format(start, end) return re.findall(pattern, anystring) string = 'I want A and I want B and I want C and...' print(Findy('want', 'and', string))

模式如下:

  1. start matches characters start
  2. (。*?)。捕获除换行符之外的任何字符,*零次或多次,?尽可能少,()是一个捕获组
  3. end匹配字符结束
  4. UDPATE :如果您不想使用空白字符,可以使用>>> [' A ', ' B ', ' C ']

    pattern = '{}\s*(\S*?)\s*{}'.format(start, end)

    输出:\s matches any white space character \S matches any non-white space character