【问题标题】:Python Regex Find All String Between Two SubstringsPython正则表达式查找两个子字符串之间的所有字符串
【发布时间】:2018-02-12 00:42:20
【问题描述】:

我希望找到两个子字符串之间的所有字符串,同时保留第一个子字符串并丢弃第二个。不过,子字符串可能是几个值之一。例如,如果这些是可能的子字符串:

subs = ['MIKE','WILL','TOM','DAVID']

我正在寻找这样的字符串:

Input:

text = 'MIKE an entry for mike WILL and here is wills text DAVID and this belongs to david'

Output:

[('MIKE': 'an entry for mike'),
 ('WILL': 'and here is wills text'),
 ('DAVID': 'and this belongs to david')]

尾随空格并不重要。我试过了:

re.findall('(MIKE|WILL|TOM|DAVID)(.*?)(MIKE|WILL|TOM|DAVID)',text)

仅返回第一次出现并保留结束子字符串。不太确定最好的方法。

【问题讨论】:

    标签: python regex substring


    【解决方案1】:

    你可以使用

    import re
    text = 'MIKE an entry for mike WILL and here is wills text DAVID and this belongs to david'
    subs = ['MIKE','WILL','TOM','DAVID']
    res = re.findall(r'({0})\s*(.*?)(?=\s*(?:{0}|$))'.format("|".join(subs)), text)
    print(res)
    # => [('MIKE', 'an entry for mike'), ('WILL', 'and here is wills text'), ('DAVID', 'and this belongs to david')]
    

    请参阅Python demo

    在这种情况下,动态构建的模式将类似于 (MIKE|WILL|TOM|DAVID)\s*(.*?)(?=\s*(?:MIKE|WILL|TOM|DAVID|$))

    详情

    • (MIKE|WILL|TOM|DAVID) - 第 1 组匹配备选子字符串之一
    • \s* - 0+ 个空格
    • (.*?) - 第 2 组捕获除换行符以外的任何 0+ 个字符(使用 re.S 标志匹配任何字符),尽可能少,直到第一个...
    • (?=\s*(?:MIKE|WILL|TOM|DAVID|$)) - 0+ 个空格后跟子字符串之一或字符串结尾 ($)。这些文本没有被消耗,因此,正则表达式引擎仍然可以获得后续匹配。

    【讨论】:

      【解决方案2】:

      您还可以使用以下正则表达式来实现您的目标:

      (MIKE.*)(?= WILL)|(WILL.*)(?= DAVID)|(DAVID.*)
      

      它使用 Positive lookahead 来获取中间字符串。 (http://www.rexegg.com/regex-quickstart.html)

      已测试: https://regex101.com/r/ZSJJVG/1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-19
        • 2012-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-27
        • 2011-08-31
        相关资源
        最近更新 更多