【问题标题】:Extract substring with regular expression in Python [duplicate]在Python中使用正则表达式提取子字符串[重复]
【发布时间】:2019-06-11 12:13:51
【问题描述】:

如何从字符串中提取关键字amisare之后的子字符串,但不包括amisare

string = 'I am John'

我用过:

re.findall('(?<=(am|is|are)).*', string)

发生错误

re.error: look-behind requires fixed-width pattern

正确的做法是什么?

【问题讨论】:

    标签: python regex


    【解决方案1】:
    import re
    
    s = 'I am John'
    
    g = re.findall(r'(?:am|is|are)\s+(.*)', s)
    print(g)
    

    打印:

    ['John']
    

    【讨论】:

      【解决方案2】:

      在这种情况下,我喜欢使用finditer,因为它返回的匹配对象比findall 返回的字符串更容易操作。您可以继续匹配 am/is/are,但也可以将字符串的其余部分与第二个子组匹配,然后从结果中仅提取该组。

      >>> import re
      >>> string = 'I am John'
      >>> [m.group(2) for m in re.finditer("(am|is|are)(.*)", string)]
      [' John']
      

      根据您的模式结构,我猜您最多只希望字符串中有一个匹配项。考虑使用re.search 而不是 findall 或 finditer。

      >>> re.search("(am|is|are)(.*)", string).group(2)
      ' John'
      

      如果您在想“实际上我想匹配 am/is/are 之后的每个单词实例,而不仅仅是第一个”,这是一个问题,因为您的 .* 组件将匹配整个其余部分第一个 am/is/are 之后的字符串。例如。对于字符串"I am John and he is Steve",它将匹配' John and he is Steve'。如果您希望 John 和 Steve 分开,也许您可​​以限制要匹配的字符类。 \w 似乎很明智:

      >>> string = "I am John and he is Steve"
      >>> [m.group(2) for m in re.finditer(r"(am|is|are) (\w*)", string)]
      ['John', 'Steve']
      

      【讨论】:

        【解决方案3】:

        其中一个解决方案是使用分区函数。有一个例子

        string = 'I am John'
        words = ['am','is','are']
        
        for word in words :
            before,word,after = string.partition(word)
            print (after)
        

        输出:

         John
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-16
          相关资源
          最近更新 更多